作者热门文章
- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在尝试从普通方法运行“异步”方法:
public string Prop
{
get { return _prop; }
set
{
_prop = value;
RaisePropertyChanged();
}
}
private async Task<string> GetSomething()
{
return await new Task<string>( () => {
Thread.Sleep(2000);
return "hello world";
});
}
public void Activate()
{
GetSomething.ContinueWith(task => Prop = task.Result).Start();
// ^ exception here
}
抛出的异常是:
Start may not be called on a continuation task.
这到底是什么意思?我怎样才能简单地在后台线程上运行我的异步方法,将结果分派(dispatch)回 UI 线程?
编辑
还尝试了 Task.Wait
,但等待永远不会结束:
public void Activate()
{
Task.Factory.StartNew<string>( () => {
var task = GetSomething();
task.Wait();
// ^ stuck here
return task.Result;
}).ContinueWith(task => {
Prop = task.Result;
}, TaskScheduler.FromCurrentSynchronizationContext());
GetSomething.ContinueWith(task => Prop = task.Result).Start();
}
最佳答案
具体修复您的示例:
public void Activate()
{
Task.Factory.StartNew(() =>
{
//executes in thread pool.
return GetSomething(); // returns a Task.
}) // returns a Task<Task>.
.Unwrap() // "unwraps" the outer task, returning a proxy
// for the inner one returned by GetSomething().
.ContinueWith(task =>
{
// executes in UI thread.
Prop = task.Result;
}, TaskScheduler.FromCurrentSynchronizationContext());
}
这会起作用,但它是老式的。
在后台线程上运行某些东西并分派(dispatch)回 UI 线程的现代方法是使用 Task.Run()
、async
和 await
:
async void Activate()
{
Prop = await Task.Run(() => GetSomething());
}
Task.Run
将在线程池线程中启动一些东西。当您 await
某些东西时,它会自动返回启动它的执行上下文。在这种情况下,您的 UI 线程。
您通常不需要调用 Start()
。首选 async
方法、Task.Run
和 Task.Factory.StartNew
-- 所有这些都会自动启动任务。使用 await
或 ContinueWith
创建的延续也会在其父级完成时自动启动。
关于c# - 在后台线程上运行 "async"方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20304258/
我是一名优秀的程序员,十分优秀!