Я использую то, что необходимо для communicatation. Обычно это - ничто вообще. Иногда это - электронная доска.
Время от времени, я использую Архитектор Sparx Enterprise , который является UML , моделируя инструмент, хотя он производит достойный diagams, в то время как это в нем. Я использовал его для требований, варианта использования, действия, последовательности, домена, и даже моделирования класса и иногда некоторых перепроектированных схем ER. Любой ценой понять через.
Попробуйте использовать класс AutoResetEvent следующим образом:
var doneEvent = new AutoResetEvent(false);
var bw = new BackgroundWorker();
bw.DoWork += (sender, e) =>
{
try
{
if (!e.Cancel)
{
// Do work
}
}
finally
{
doneEvent.Set();
}
};
bw.RunWorkerAsync();
doneEvent.WaitOne();
Внимание: Вы должны убедиться, что doneEvent.Set ()
вызывается независимо от того, что происходит. Также вы можете предоставить doneEvent.WaitOne ()
аргумент, определяющий период ожидания.
Примечание: Этот код в значительной степени является копией Fredrik Kalseth ответьте на аналогичный вопрос .
BackgroundWorker имеет событие завершения. Вместо ожидания вызовите оставшийся путь кода из обработчика завершения.
не совсем понимаю, что вы имеете в виду под ожиданием. Вы имеете в виду, что хотите, чтобы что-то было сделано (BW) после этого, вы хотите сделать что-то еще? Используйте bw.RunWorkerCompleted, как и вы (используйте отдельную функцию для удобочитаемости), и в этой функции обратного вызова выполните следующие действия. Запустите таймер, чтобы проверить, не занимает ли работа слишком много времени.
var handler = GetTheRightHandler();
var bw = new BackgroundWorker();
bw.RunWorkerCompleted += (sender, args) =>
{
OnAsyncOperationCompleted(sender, args);
});
bw.DoWork += OnDoWorkLoadChildren;
bw.RunWorkerAsync(handler);
Timer Clock=new Timer();
Clock.Interval=1000;
Clock.Start();
Clock.Tick+=new EventHandler(Timer_Tick);
public void Timer_Tick(object sender,EventArgs eArgs)
{
if (bw.WorkerSupportsCancellation == true)
{
bw.CancelAsync();
}
throw new TimedoutException("bla bla bla");
}
В OnDoWorkLoadChildren:
if ((worker.CancellationPending == true))
{
e.Cancel = true;
//return or something
}