近来在学习Eugene Agafonov编写的《C#多线程编程实战》(译),做些笔记也顺便分享一下^-^
using System;
using System.Threading.Tasks;
using System.Threading;
namespace 在Lambda表达式中使用await操作符
{
class Program
{
static void Main(string[] args)
{
Task t = AsyncchronousProcessing();
t.Wait();
Console.ReadKey();
}
async static Task AsyncchronousProcessing()
{
Func<string, Task<string>> asyncLambda = async name =>
{
await Task.Delay(TimeSpan.FromSeconds(2));
return string.Format("Task {0} is running on a thread id {1}.I shtead pool thread: {2}",
name, Thread.CurrentThread.ManagedThreadId,
Thread.CurrentThread.IsThreadPoolThread);
};
string result = await asyncLambda("async lambda");
Console.WriteLine(result);
}
}
}
程序运行结果如下:
首先,由于不能再Main方法中使用async,我们将异步函数移到了AsynchronousProcessing方法中。然后使用async关键字声明了一个lambda表达式。由于任何lambda表达式的类型都不能通过lambda自身来推断,所以不得不显式向C#编译器指定它的类型。在本例中,该类型说明该lambda表达式接受一个字符串参数,并返回一个Task<string>对象。
接着,我们定义了lambda表达式体。有个问题是该方法被定义为返回一个Task<string>对象,但实际上返回的是字符串,却没有编译错误!这是因为C#编译器自动产生一个任务并返回给我们。