Fire和Forgot的async / await方法

时间:2017-08-18 08:50:23

标签: c# winforms asynchronous async-await

假设我在winforms应用程序中有以下代码。

    private async Task<decimal> DivAsync(int a, int b)
    {
        await TaskEx.Delay(2000);
        return a / b;
    }

    private async Task DivAsyncWithErrorHandling(int a, int b)
    {
        try
        {
            await DivAsync(a, b);
        }
        catch (DivideByZeroException)
        {
            Debug.WriteLine("DivAsync({0}, {1}) failed", a, b);
        }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        DivAsyncWithErrorHandling(5, 0);
    }

    private void button2_Click(object sender, EventArgs e)
    {
        TaskEx.Run(() => DivAsyncWithErrorHandling(5, 0));
    }

    private async void button3_Click(object sender, EventArgs e)
    {
        await DivAsyncWithErrorHandling(5, 0);
        await SomeThingElse();
    }

显然,我真正的单词代码还有其他功能。关键是,我已经有错误处理。代码DivAsyncWithErrorHandling可以与await一起运行(请参阅示例button3_Click),因此我无法使用async void方法,但也可能会遇到火灾而忘记。

button1_Clickbutton2_Click都会产生例外结果(DivAsyncWithErrorHandling在不阻止ui的情况下异步运行,但具有不同的优点/缺点。

button1_Click显示警告Because this call is not awaited, execution ... continues before the call is complete.,但代码较少

enter image description here

button2_Click没有显示警告,但有更多代码要编写并使用另一个任务。

所以我的问题是。在这种情况下,最好的解决方案是什么?忽略该警告并使用button1或使用button2

也许有一个更好的解决方案已经建立类似于task.RunSynchronously,但有火并忘了。

DivAsyncWithErrorHandling(5, 0).RunAsynchronously();

目的是转换“旧样式”例程,该例程将完成后的可选操作继续到异步/等待模式

    private DivAsyncWithErrorHandlingOld(int a, int b, Action after = null)
    {
        Task.Factory.StartNew(() =>
        {
            try
            {
                Div(a, b);
            }
            catch (DivideByZeroException)
            {
                Debug.WriteLine("DivAsync({0}, {1}) failed", a, b);
            }
            after?.Invoke();
        });
    }

1 个答案:

答案 0 :(得分:-1)

使用Task.Run,​​因为它发生的事情更明显,这是推荐的方法。

&#34;当不需要对任务的创建和调度进行更多控制时,Run方法是创建和启动任务的首选方式。&#34; 资料来源:https://docs.microsoft.com/en-us/dotnet/standard/parallel-programming/task-based-asynchronous-programming

&#34;如果您的工作受CPU限制并且您关心响应能力,请使用async并等待,但使用Task.Run在另一个线程上生成工作。&#34; 资料来源:https://docs.microsoft.com/en-us/dotnet/csharp/async