小编典典

与异步即发即弃与“旧的异步委托”

c#

我试图用一种新的语法替换以前的“一劳永逸”的调用,希望更加简单,这似乎使我望而却步。这是一个例子

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方法,才能添加该单行代码。在性能/清理方面是否有一些看不见的收获?

如果无法修改后台方法,我将如何应用异步?在我看来,没有直接的方法,我必须创建一个等待Task.Run()的包装异步方法?

编辑:我现在看到我可能缺少一个真正的问题。问题是:给定一个同步方法A(),如何在不使用比“旧方法”更复杂的解决方案的情况下,以即发即弃的方式
使用async/ 异步调用它?await


阅读 254

收藏
2020-05-19

共1个答案

小编典典

避免async void。它具有关于错误处理的棘手语义。我知道有人称其为“失火”,但我通常使用“失火”一词。

问题是:给定一个同步方法A(),我该如何使用即发即弃方式使用async / await异步调用它,而又没有比“旧方法”更复杂的解决方案

您不需要async/ await。只是这样称呼它:

Task.Run(A);
2020-05-19