Dee*_*101 6 .net multithreading task-parallel-library
由于基于任务的异步模式现在是推荐的路由(根据MSDN @ here和here),我如何将hello world
下面的简单代码转换为基于任务的异步模式?
让我们假设我什么都不知道Tasks
,我试图向工作人员演示输入和输出,以及从'main'调用.
class Program
{
static void Main(string[] args)
{
Worker wk = new Worker();
string result = wk.DoWork(1000);
Console.WriteLine(result);
Console.WriteLine("Main says, Hello World!");
Console.ReadLine();
}
}
class Worker
{
public string DoWork(int delay)
{
Console.WriteLine("Worker says, working ...");
Thread.Sleep(delay); // represents the 100ms+ workload
return "Worker says, I'm done! Hello World!";
}
}
Run Code Online (Sandbox Code Playgroud)
这取决于您到底想要异步什么。如果Thread.Sleep()
代表一些 CPU 密集型工作,那么您将不会从使用 TAP 中获得太多好处。
如果您想让等待内部DoWork()
异步,这意味着将签名从string
to更改async Task<string>
为然后使用await Task.Delay()
而不是Thread.Sleep()
。
如果您还想进行Main()
异步,则可以(如果您使用的是 C# 7.1 或更高版本)。
如果您使用的是旧版本的 C#,那么它就变成了。您可以做的是创建异步MainAsync()
,然后Wait()
在实际中创建同步Main()
。这意味着主线程将被阻塞,但我们需要它来保持应用程序处于活动状态。另外,将异步await
与同步混合Wait()
通常不是一个好主意(特别是因为它经常导致死锁),但在这种情况下这是可以的。
如果我们进行Main()
异步,那么将阻塞也设为异步会很好ReadLine()
。没有Console.ReadLineAsync()
,但我们可以用Console.In
它。
所以,最终的代码将如下所示:
class Program
{
static void Main()
{
MainAsync().Wait();
}
static async Task MainAsync()
{
var worker = new Worker();
string result = await worker.DoWork(1000);
Console.WriteLine(result);
Console.WriteLine("Main says, Hello World!");
await Console.In.ReadLineAsync();
}
}
class Worker
{
public async Task<string> DoWork(int delay)
{
Console.WriteLine("Worker says, working ...");
await Task.Delay(delay); // represents the 100ms+ workload
return "Worker says, I'm done! Hello World!";
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3474 次 |
最近记录: |