So können Sie es machen mit 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. B. eine Anforderung von .Net 2.0), können Sie ManualResetEvent
wie in der Antwort von JaredPar erwähnt, oder verwenden Sie etwas wie dieses:
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 nicht explizit Ereignisse, so dass Sie sich nicht um deren Beseitigung kümmern müssen.
Beispiel für die Verwendung:
var rh = new RunHelper(
() =>
{
Thread.Sleep(1000);
});
if (rh.Wait(500))
{
Console.WriteLine("Success.");
}
else
{
Console.WriteLine("Timeout.");
}