等待替代在.NET 4.0中?(Await alternative in .NET 4.0?)

2019-07-03 20:19发布

什么是在.NET 4.0中的await关键字的最佳替代品? 我有需要异步操作后返回一个值的方法。 我注意到wait()方法块中的线程完全因而使异步操作无用。 我有哪些选择运行异步操作,同时还释放UI线程?

Answer 1:

我觉得你的基本选项

  • 使用Task.ContinueWith()
  • 使用异步CTP和async / await
  • 使用无扩展

最简单的方法可能是安装异步CTP。 据我所知道的许可证允许使用罗科梅。 它修补编译器,并配有150KB的DLL,您可以包括到您的项目。

您可以使用Task.ContinueWith() 但是,这意味着,你必须付出一些努力与exeption处理和流量控制。

任务的功能结构。 这就是为什么ContinueWith()不符合必要的结构,如拌匀for循环或try-catch块。 因此, asyncawait得到了介绍,使编译器可以帮助我们。

如果你不能有一个支持的编译器(即您使用.NET 4.0),最好的办法是使用TAP与功能框架在一起。 无扩展是治疗异步方法一个非常好的框架。

只是谷歌用于“无扩展任务”即可开始。



Answer 2:

就像你可以实现一个行为, awaityield协程,我在非4.5代码中使用此。 你需要一个YieldInstruction是从哪个应该运行的异步方法检索类:

public abstract class YieldInstruction
{
    public abstract Boolean IsFinished();
}

然后,你需要的一些实现YieldInstruction (AE TaskCoroutine它处理任务),并使用这种方式(伪代码):

public IEnumerator<YieldInstruction> DoAsync()
{
    HttpClient client = ....;
    String result;
    yield return new TaskCoroutine(() => { result = client.DownloadAsync(); });
    // Process result here
}

现在,你需要它处理的指令的执行调度。

for (Coroutine item in coroutines)  
{  
    if (item.CurrentInstruction.IsFinished())  
    {
         // Move to the next instruction and check if coroutine has been finished 
         if (item.MoveNext()) Remove(item);
    }
}

当开发WPF或WinForms的应用程序,你也能避免任何Invoke呼叫如果您在合适的时间更新协程。 您可能还能够延长的想法,使您的生活更轻松。 样品:

public IEnumerator<YieldInstruction> DoAsync()
{
    HttpClient client = ....;
    client.DownloadAsync(..);

    String result;
    while (client.IsDownloading)
    {
        // Update the progress bar
        progressBar.Value = client.Progress;
        // Wait one update
        yield return YieldInstruction.WaitOneUpdate;
    }
    // Process result here
}


文章来源: Await alternative in .NET 4.0?