无法在异步调用中等待对象

dis*_*kid 1 c# asynchronous winforms async-await

我有一个名为DoSomething()return的方法,object并且非常耗时.所以我想使用async/await让它在后台运行,同时我的GUI显示" 等待响应... "消息.

在我的调用方法中:

Task taskDoSomething = new Task(DoSomethingAsync);
taskDoSomething.Start();
taskDoSomething.Wait();
// continue the program
Run Code Online (Sandbox Code Playgroud)

我的DoSomethingAsync方法:

private async void DoSomethingAsync()
{
    Object result = await DoSomething();
}
Run Code Online (Sandbox Code Playgroud)

但是我收到了错误:

无法等待[ObjectType]

并且[ObjectType]是我自己创造的一种物体.我只是用上面的对象不要混淆读者.

请让我知道我做错了什么,让我摆脱分散的处理BackgroundWorker.

Jon*_*eet 10

我想你误会了如何asyncawait工作.如果DoSomething()是一个长期运行的方法,它不是为异步设计的,你可能只想在不同的线程中执行它,例如通过启动一个单独的任务:

Task<object> task = Task.Run<object>(DoSomething);
Run Code Online (Sandbox Code Playgroud)

请注意,这意味着DoSomething无法与UI交互,因为它将位于不同的线程上.

await如果您愿意,您可以执行该任务 - 但仅限于异步方法.在不了解更多背景的情况下,很难提供更具体的建议.

根据您的评论,您可能会有以下内容:

private async void HandleButtonClick(object sender, EventArgs e)
{
    Task<object> task = Task.Run<object>(DoSomething);
    object result = await task;
    status.Text = "I've done something";
    // Use the result?
}
Run Code Online (Sandbox Code Playgroud)


i3a*_*non 5

如果DoSomething是同步的(它似乎是)并且你想将它卸载到另一个线程以保持UI响应,你应该使用Task.Run:

async Task DoSomethingAsync()
{
    var result = await Task.Run(() => DoSomething());
}
Run Code Online (Sandbox Code Playgroud)

async void除非在事件处理程序中,否则也不应该使用.
没有理由直接创建任务.要么DoSomethingAsync返回一个,Task要么完全删除该方法并Task.Run直接使用.


但是,如果DoSomething本质上是异步的,则应使用它async-await并使其隐式返回任务.

  • @Pedram这是一个不好的参考.你应该看一下Stephen Cleary的介绍:http://blog.stephencleary.com/2012/02/async-and-await.html (2认同)