我正在尝试从普通方法运行“异步”方法:

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()asyncawait:
async void Activate()
{
    Prop = await Task.Run(() => GetSomething());
}
Task.Run将在线程池线程中启动某些内容。当您对某些内容进行await编码时,它会自动返回到启动它的执行上下文中。在这种情况下,您的UI线程。

通常,您永远不需要调用Start()。首选async方法,Task.RunTask.Factory.StartNew-所有这些方法都会自动启动任务。当父项完成时,用awaitContinueWith创建的延续也将自动开始。

关于c# - 在后台线程上运行 “async”方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20304258/

10-12 00:27
查看更多