如何使这段代码使用async并等待?

时间:2014-08-15 02:37:32

标签: c# .net asynchronous task-parallel-library async-await

我刚开始学习异步并等待。如何使下面的代码与async / await一起使用?它仅在我删除await关键字时才编译。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Threading;
using System.Threading.Tasks;

namespace ConsoleApplication4
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            AsyncExperiment();
            Console.ReadLine();
        }

        private static void AsyncExperiment()
        {
              //var t1 =  Task.Run(() => LongProcess()); //ok
              var t2= await  Task.Run(()=>LongProcess()); //compile time error

        }


        private static void LongProcess()
        {
            //a call to some slow service
        }

    }
}

2 个答案:

答案 0 :(得分:4)

除了LongProcess void以外,await关键字缺少需要加入方法签名的async关键字:

private static async void AsyncExperiment()

有几点需要注意:

  1. async void仅适用于顶级事件处理程序。相反,如果您有一个返回void的方法

  2. ,请使用async Task
  3. Should I expose asynchronous wrappers for synchronous methods?,答案通常是否定的。您应该考虑为什么需要在Task.Run中包装此方法。我知道这是尝试测试Task Parallel Library,但你应该牢记这一点。让同步方法的使用者改为使用Task.Run

  4. 如果您的工作是IO绑定的,就像调用Web服务一样,通常不需要使用ThreadPool线程。例如,如果您的服务使用REST,则可以使用公开异步方法的HttpClient库(GetAsyncPostAsync等。)。使用异步,真的,There Is No Thread

答案 1 :(得分:3)

LongProcess()是一种返回void的方法。

就像你不能指望这一点起作用:

var result = LongProcess();

你不能指望它能起作用:

var result = await Task.Run(() => LongProcess());
此处使用的

Task.Run()会返回Task(没有结果)。只需在不指定任何内容的情况下调用它。

await Task.Run(() => LongProcess());