如何在两个不同的线程上等待一个任务?
How to await for one task on two different threads?
我可以等待在不同线程上创建的任务吗?例如:
...
CurrentIteration = Execute(); // returns Task
await CurrentIteration;
...
然后,在另一个线程中:
...
await CurrentIteration;
...
- 第二个线程是否会等待Execute方法执行完毕?
- 如果可以,我是否可以在第二个线程中出于相同目的重新使用 CurrentIteration,因为我重新 运行
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);
}
}
但它打印
thread 1 waiting...
thread 2 started... waiting...
然后
thread 1 done!!
但从来没有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();
}
完成等待任务后,在第二个线程上添加等待。
您没有看到指示的原因是因为控制台卡在 ReadKey
方法上,并且在完成之前无法写入任何内容。如果您按下 Enter,您会在应用程序关闭前看到 "thread 2 ended!!!!!" 行一秒钟。
我可以等待在不同线程上创建的任务吗?例如:
...
CurrentIteration = Execute(); // returns Task
await CurrentIteration;
...
然后,在另一个线程中:
...
await CurrentIteration;
...
- 第二个线程是否会等待Execute方法执行完毕?
- 如果可以,我是否可以在第二个线程中出于相同目的重新使用 CurrentIteration,因为我重新 运行
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);
}
}
但它打印
thread 1 waiting...
thread 2 started... waiting...
然后
thread 1 done!!
但从来没有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();
}
完成等待任务后,在第二个线程上添加等待。
您没有看到指示的原因是因为控制台卡在 ReadKey
方法上,并且在完成之前无法写入任何内容。如果您按下 Enter,您会在应用程序关闭前看到 "thread 2 ended!!!!!" 行一秒钟。