我刚开始学习异步并等待。如何使下面的代码与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
}
}
}
答案 0 :(得分:4)
除了LongProcess
void
以外,await
关键字缺少需要加入方法签名的async
关键字:
private static async void AsyncExperiment()
有几点需要注意:
async void
仅适用于顶级事件处理程序。相反,如果您有一个返回void的方法
async Task
Should I expose asynchronous wrappers for synchronous methods?,答案通常是否定的。您应该考虑为什么需要在Task.Run
中包装此方法。我知道这是尝试测试Task Parallel Library
,但你应该牢记这一点。让同步方法的使用者改为使用Task.Run
。
如果您的工作是IO绑定的,就像调用Web服务一样,通常不需要使用ThreadPool线程。例如,如果您的服务使用REST,则可以使用公开异步方法的HttpClient
库(GetAsync
,PostAsync
等。)。使用异步,真的,There Is No Thread。
答案 1 :(得分:3)
LongProcess()
是一种返回void
的方法。
就像你不能指望这一点起作用:
var result = LongProcess();
你不能指望它能起作用:
var result = await Task.Run(() => LongProcess());
此处使用的 Task.Run()
会返回Task
(没有结果)。只需在不指定任何内容的情况下调用它。
await Task.Run(() => LongProcess());