nic*_*cks 2 .net c# multithreading async-await c#-7.0
我可以等待在不同线程上创建的任务吗?例如:
...
CurrentIteration = Execute(); // returns Task
await CurrentIteration;
...
Run Code Online (Sandbox Code Playgroud)
然后,在另一个线程上:
...
await CurrentIteration;
...
Run Code Online (Sandbox Code Playgroud)
CurrentIteration = Execute(); // returns Task
await CurrentIteration;
在第一个线程?
我试过这段代码:
public class Program
{
public static void Main(string[] args)
{
MainAsync(args).GetAwaiter().GetResult();
}
public static async Task MainAsync(string[] args)
{
var instance = new SomeClass();
var task = instance.Execute();
Console.WriteLine("thread 1 waiting...");
Task.Run(async () =>
{
Console.WriteLine("thread 2 started... waiting...");
await task;
Console.WriteLine("thread 2 ended!!!!!");
});
await task;
Console.WriteLine("thread 1 done!!");
Console.ReadKey();
}
}
public class SomeClass
{
public async Task Execute()
{
await Task.Delay(4000);
}
}
Run Code Online (Sandbox Code Playgroud)
但它打印
thread 1 waiting...
thread 2 started... waiting...
Run Code Online (Sandbox Code Playgroud)
然后
thread 1 done!!
Run Code Online (Sandbox Code Playgroud)
但从来没有thread 2 ended!!!!!.这是为什么?我怎样才能做到这一点?谢谢!
您可以await从多个线程执行任务.你真的很接近让它工作,正如@Rob所说,你只需要await第二个线程.
考虑一下:
public static async Task MainAsync(string[] args)
{
var instance = new SomeClass();
var task = instance.Execute();
Console.WriteLine("thread 1 waiting...");
var secondTask = Task.Run(async () =>
{
Console.WriteLine("thread 2 started... waiting...");
await task;
Console.WriteLine("thread 2 ended!!!!!");
});
await task;
await secondTask;
Console.WriteLine("thread 1 done!!");
Console.ReadKey();
}
Run Code Online (Sandbox Code Playgroud)
完成等待任务后,在第二个线程上添加等待.
您没有看到指示的原因是因为控制台卡在ReadKey方法上,并且在完成之前无法写入任何内容.如果你按Enter键,你可以看到"线程2结束!!!!!" 应用程序关闭前的第二行.
| 归档时间: |
|
| 查看次数: |
1083 次 |
| 最近记录: |