我正在尝试从普通方法运行“异步”方法:
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
}
抛出的异常是:
到底是什么意思?如何简单地在后台线程上运行异步方法,将结果分配回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/