So können Sie es machen System.Threading.Tasks
:
Task t = Task.Factory.StartNew(
() =>
{
Thread.Sleep(1000);
});
if (t.Wait(500))
{
Console.WriteLine("Success.");
}
else
{
Console.WriteLine("Timeout.");
}
Wenn Sie Tasks jedoch aus irgendeinem Grund nicht verwenden können (z. ManualResetEvent
B. gemäß einer Anforderung von .Net 2.0), können Sie diese wie in der Antwort von JaredPar erwähnt verwenden oder Folgendes verwenden:
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);
}
}
}
Mit dem Wait / Pulse-Ansatz erstellen Sie keine expliziten Ereignisse, sodass Sie sich nicht um deren Entsorgung kümmern müssen.
Anwendungsbeispiel:
var rh = new RunHelper(
() =>
{
Thread.Sleep(1000);
});
if (rh.Wait(500))
{
Console.WriteLine("Success.");
}
else
{
Console.WriteLine("Timeout.");
}