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
我想你误会了如何async和await工作.如果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)
如果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并使其隐式返回任务.
| 归档时间: |
|
| 查看次数: |
6408 次 |
| 最近记录: |