Delen via


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;
        }
    }
}