Compilerfout CS4004
Kan niet wachten in een onveilige context
Opmerking
In het volgende voorbeeld wordt CS4004 gegenereerd:
using System.Threading.Tasks;
public static class C
{
public static unsafe async Task<string> ReverseTextAsync(string text)
{
return await Task.Run(() =>
{
if (string.IsNullOrEmpty(text))
{
return text;
}
fixed (char* pText = text)
{
char* pStart = pText;
char* pEnd = pText + text.Length - 1;
for (int i = text.Length / 2; i >= 0; i--)
{
char temp = *pStart;
*pStart++ = *pEnd;
*pEnd-- = temp;
}
return text;
}
});
}
}
Met deze code wordt een fout gegenereerd in C# 13 omdat de await
code zich in het unsafe
blok bevindt.
De ReverseText
methode maakt naïef gebruik van een achtergrondtaak om asynchroon een nieuwe tekenreeks te maken in omgekeerde volgorde van een bepaalde tekenreeks.
Deze fout corrigeren
Als u de onveilige code scheidt van de te verwachten code, wordt deze fout gecorrigeerd. Eén scheidingstechniek is het maken van een nieuwe methode voor de onveilige code en roept deze vervolgens aan vanuit de te verwachten code. Voorbeeld:
public static class C
{
public static async Task<string> ReverseTextAsync(string text)
{
return await Task.Run(() => ReverseTextUnsafe(text));
}
private static unsafe string ReverseTextUnsafe(string text)
{
if (string.IsNullOrEmpty(text))
{
return text;
}
fixed (char* pText = text)
{
char* pStart = pText;
char* pEnd = pText + text.Length - 1;
for (int i = text.Length / 2; i >= 0; i--)
{
char temp = *pStart;
*pStart++ = *pEnd;
*pEnd-- = temp;
}
return text;
}
}
}