Мне нужен способ выполнить какое-то действие синхронно, которое должно завершиться за полсекунды, но может просто задержаться на несколько минут. Если время истекло, мне плевать на результат. Вот я делаю это прямо сейчас, используя сгенерированный компилятором делегат. BeginInvoke:
static void Main()
{
bool disposed = false;
var wait = new ManualResetEvent(false);
var a = new Action(
() =>
{
Thread.Sleep(1000); // <- some looong action
if (!disposed)
lock (wait)
if (!disposed)
wait.Set();
});
a.BeginInvoke(a.EndInvoke, null);
bool success = wait.WaitOne(500);
Console.WriteLine(success ? "success" : "timeout");
lock (wait)
{
wait.Dispose();
disposed = true;
}
Console.ReadLine();
}
выглядит некрасиво. И я знаю, что переменная disposed
лямбда-замыкания модифицирована (в отличие от моего ReSharper, мне нравится эта функция C #). Все потому, что я хочу распоряжаться ManualResetEvent
. Можете ли вы предложить лучший подход в .NET4? Может, мне просто пропустить удаление события и положиться на GC?
Одно примечание: ManualResetEvent.Set()
взрывается, если вы попытаетесь сделать это на удаленном экземпляре.