我正在寻找某种多线程锁,例如,
ManualResetEvent mre = new ManualResetEvent(false);
new Thread(()=>
{
//Do something here, we name it "Task 1"
mre.Set();
}).Start();
mre.WaitOne();
//Do another thing, we name it "Task 2"
这将确保在任务1完成之前不会执行任务2。
现在有另一种情况
//We assume there are two tasks must be completed before the third can be started
int taskCount = 2;
SomeLock lock = new SomeLock(taskCount);
new Thread(()=>
{
//Do something here, we name it "Task 1"
lock.Release();
}).Start();
new Thread(()=>
{
//Do something here, we name it "Task 2"
lock.Release();
}).Start();
lock.Wait();
//Do another thing, we name it "Task 3"
lock
由一个参数构成,该参数指示任务的总和(在本例中为两个(。
然后lock.Wait()
应该阻塞程序,直到两个线程都完成任务并退出。
这就像是Semaphore
的反向版本。
为什么不使用线程池和Task
库?它包含方法Task.WaitAll
,可以执行您想要的操作。
Task task1 = Task.Run(() =>
{
// do something
});
Task task2 = Task.Run(() =>
{
// do something else
});
Task.WaitAll(task1, task2);
我知道这并不能直接回答您的问题,但这是一种替代方法。试试微软的Reactive Framework(又名Rx(-NuGetSystem.Reactive
并添加using System.Reactive.Linq;
,然后你就可以做到这一点:
async Task Main()
{
var query1 =
from t1 in Observable.Start(() => Task1())
from t2 in Observable.Start(() => Task2())
select new { t1, t2 };
var query2 =
from x in query1
from t3 in Observable.Start(() => Task3())
select new { x.t1, x.t2, t3 };
var result = await query2;
}
现在,如果这三个任务实际上是async
本身,那么它是这样完成的:
async Task Main()
{
var query1 =
from t1 in Observable.FromAsync(() => Task1Async())
from t2 in Observable.FromAsync(() => Task2Async())
select new { t1, t2 };
var query2 =
from x in query1
from t3 in Observable.FromAsync(() => Task3Async())
select new { x.t1, x.t2, t3 };
var result = await query2;
}