【发布时间】:2011-11-23 09:10:24
【问题描述】:
我有一个场景,我的 C# 类有两个方法,例如 DoThis() 和 DoThat(),它们被外部调用者以任何顺序相互独立地调用。这两个方法需要通过以下方式同步:
- 在调用
DoThis()后,至少等待t1秒,然后再继续执行DoThat() - 调用
DoThat()后,至少等待t2秒,然后再继续执行DoThis()
所以本质上是伪代码:
static SomeCustomTimer Ta, Tb;
static TimeSpan t1, t2;
public static void DoThis()
{
if(Tb.IsRunning())
Tb.WaitForExpiry();
DoStuff();
Ta.Start(t1);
}
public static void DoThat()
{
if(Ta.IsRunning())
Ta.WaitForExpiry();
DoOtherStuff();
Tb.Start(t2);
}
DoStuff() 和 DoOtherStuff() 是不是长时间运行的方法,否则不共享资源。通常不会同时调用DoThis() 和DoThat()。但我仍然需要防止潜在的死锁。
如何在 C# 中最好地实现 DoThis()、DoThat()?
编辑 我现在的场景很简单,因为没有任意数量的线程调用这些函数。为简化起见,有一个调用者线程以任意顺序调用这些函数。因此这两个方法不会被同时调用,而是调用者会以任意顺序一个接一个地调用这些方法。我无法控制调用者线程的代码,所以我想在连续调用 DoThis()、DoThat() 之间强制执行延迟。
【问题讨论】:
-
只是想检查一下:你想“中断”另一个线程的执行一段时间——现在不管它在哪里执行? (所以线程根本没有处理器时间)?我想您可以尝试使用 Threads 来做到这一点,但我认为这根本不会防止死锁 - 如果一个线程持有锁并且您暂停它,您希望获得什么?
-
这不会为每次调用
DoThis或DoThat创建一个无限但延迟的循环吗?这就是你想要的吗? -
@CarstenKönig 不,我不想中断线程执行。我想防止并发执行,如果另一个线程刚刚在一段时间内完成,我还想延迟启动一个线程。
标签: c# .net multithreading synchronization