我试图用一种新的语法替换以前的“一劳永逸”的调用,希望更加简单,这似乎使我望而却步。这是一个例子
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关闭手柄,这仍然是有争议的),我不得不等待a以一种新的方式迷失了Task.Yield(),这实际上带来了一个新的问题。必须重写所有现有的异步F&F方法,才能添加该单行代码。在性能/清理方面是否有一些看不见的收获?
EndInvoke
Task.Yield()
如果无法修改后台方法,我将如何应用异步?在我看来,没有直接的方法,我必须创建一个等待Task.Run()的包装异步方法?
编辑:我现在看到我可能缺少一个真正的问题。问题是:给定一个同步方法A(),如何在不使用比“旧方法”更复杂的解决方案的情况下,以即发即弃的方式 使用async/ 异步调用它?await
async
await
避免async void。它具有关于错误处理的棘手语义。我知道有人称其为“失火”,但我通常使用“失火”一词。
async void
问题是:给定一个同步方法A(),我该如何使用即发即弃方式使用async / await异步调用它,而又没有比“旧方法”更复杂的解决方案
您不需要async/ await。只是这样称呼它:
Task.Run(A);