正在寻找合适的多线程锁



我正在寻找某种多线程锁,例如,

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;
}

最新更新