无法在不安全的上下文中等待
示例
下面的示例生成 CS4004:
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;
}
});
}
}
此代码在 C# 13 中会产生错误,因为 await
位于 unsafe
块中。
ReverseText
方法天真地使用后台任务按给定字符串的反向顺序异步创建新字符串。
更正此错误
将不安全代码与可等待代码分开会更正此错误。 一种分离技术是为不安全代码创建新方法,然后从可等待代码中进行调用。 例如:
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;
}
}
}