Хм .. Что вам нужно в этом случае: один поток вызывает DoThis некоторое время подряд.Другой может запускать DoThat как минимум через t2 секунды после последнего вызова DoThat или первого после последнего вызова DoThat?
Я думаю, если ваша целевая платформа Win, то лучше использовать WaitableTimer (однако это нереализовано в .NET, но вы можете использовать его через API. Вам нужно определить эти функции:
[DllImport("kernel32.dll")]
public static extern IntPtr CreateWaitableTimer(IntPtr lpTimerAttributes, bool bManualReset, string lpTimerName);
[DllImport("kernel32.dll")]
public static extern bool SetWaitableTimer(IntPtr hTimer, [In] ref long pDueTime,
int lPeriod, IntPtr pfnCompletionRoutine,
IntPtr lpArgToCompletionRoutine, bool fResume);
[DllImport("kernel32", SetLastError = true, ExactSpelling = true)]
public static extern Int32 WaitForSingleObject(IntPtr handle, int milliseconds);
public static uint INFINITE = 0xFFFFFFFF;
и затем использовать его следующим образом:
private IntPtr _timer = null;
//Before first call of DoThis or DoThat you need to create timer:
//_timer = CreateWaitableTimer (IntPtr.Zero, true, null);
public static void DoThis()
{
//Waiting until timer signaled
WaitForSingleObject (_timer, INFINITE);
DoStuff();
long dueTime = 10000 * 1000 * seconds; //dueTime is in 100 nanoseconds
//Timer will signal once after expiration of dueTime
SetWaitableTimer (_timer, ref dueTime, 0, IntPtr.Zero, IntPtr.Zero, false);
}
public static void DoThis()
{
//Waiting until timer signaled
WaitForSingleObject (_timer, INFINITE);
DoOtherStuff();
long dueTime = 10000 * 1000 * seconds; //dueTime is in 100 nanoseconds
//Timer will signal once after expiration of dueTime
SetWaitableTimer (_timer, ref dueTime, 0, IntPtr.Zero, IntPtr.Zero, false);
}
И после использования вы можете уничтожитьтаймер по вызову CloseHandle.