我试图用一种新的语法来替换我的老式“火与忘”调用,希望能够更加简单,但这似乎让我感到困惑。举个例子
class Program
{
static void DoIt(string entry)
{
Console.WriteLine("Message: " + entry);
}
static async void DoIt2(string entry)
{
await Task.Yield();
Console.WriteLine("Message2: " + entry);
}
static void Main(string[] args)
{
// old way
Action<string> async = DoIt;
async.BeginInvoke("Test", ar => { async.EndInvoke(ar); ar.AsyncWaitHandle.Close(); }, null);
Console.WriteLine("old-way main thread invoker finished");
// new way
DoIt2("Test2");
Console.WriteLine("new-way main thread invoker finished");
Console.ReadLine();
}
}
这两种方法做同样的事情,但是我似乎已经得到了什么(不需要 EndInvoke
和关闭句柄,这仍然是有点争议的) ,我正在失去在新的方式等待一个 Task.Yield()
,这实际上提出了一个新的问题,不得不重写所有现有的异步 F & F 方法,只是添加一行。在性能/清理方面是否有一些看不见的收益?
如果我不能修改后台方法,我将如何应用异步?在我看来,没有直接的方法,我将不得不创建一个包装器异步方法,将等待任务。跑?
编辑: 我现在发现我可能漏掉了一个真正的问题。问题是: 如果给定一个同步方法 A () ,我怎么能够以一种即刻忘记的方式使用 async
/await
异步调用它,而不得到比“旧方法”更复杂的解决方案呢