다음으로 할 수있는 방법은 다음과 System.Threading.Tasks
같습니다.
Task t = Task.Factory.StartNew(
() =>
{
Thread.Sleep(1000);
});
if (t.Wait(500))
{
Console.WriteLine("Success.");
}
else
{
Console.WriteLine("Timeout.");
}
그러나 어떤 이유로 (.Net 2.0의 요구 사항과 같은) Tasks를 사용할 수 없다면 ManualResetEvent
JaredPar의 답변에서 언급 한 것처럼 사용하거나 다음과 같이 사용할 수 있습니다.
public class RunHelper
{
private readonly object _gate = new object();
private bool _finished;
public RunHelper(Action action)
{
ThreadPool.QueueUserWorkItem(
s =>
{
action();
lock (_gate)
{
_finished = true;
Monitor.Pulse(_gate);
}
});
}
public bool Wait(int milliseconds)
{
lock (_gate)
{
if (_finished)
{
return true;
}
return Monitor.Wait(_gate, milliseconds);
}
}
}
Wait / Pulse 접근 방식을 사용하면 이벤트를 명시 적으로 만들지 않으므로 이벤트를 처리 할 필요가 없습니다.
사용 예 :
var rh = new RunHelper(
() =>
{
Thread.Sleep(1000);
});
if (rh.Wait(500))
{
Console.WriteLine("Success.");
}
else
{
Console.WriteLine("Timeout.");
}