Где-то в коде waitHandle используется для выполнения некоторых действий. Однако проблема с waithandle заключается в том, что форма зависает в ожидании завершения какого-либо действия. Таким образом, следующий код не будет работать:
frmProgressBar.show();
int successOrFail = PerformSynchronousActionUsingWaitHandle();
frmProgressBar.close();
frmMainScreen.show();
Это не сработает, поскольку вместо этого будет заморожен frmProgressBar. Мне действительно нужно сохранить строку №1, строку №3 и строку №4, но как мне переписать PerformSynchronousActionUsingWaitHandle () так, чтобы операция оставалась синхронной, но отображался индикатор выполнения. Возможно, я смогу обойти это, показав индикатор выполнения в другом потоке, но конструкция системы такова, что это будет очень беспорядочно.





Разве вы не можете использовать класс BackgroundWorker? http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx
Используйте два разных потока для обработки этого ... один поток для индикатора выполнения и один поток для PerformSynchronousActionUsingWaitHandle (). Надеюсь, это каким-то образом поможет
Вы пробовали вместо этого использовать класс Справочная информация? Однако вам нужно будет переписать метод, выполняющий синхронную задачу.
вы хотите запустить PerformSynchronousActionUsingWaitHandle в потоке, чтобы он не блокировал поток пользовательского интерфейса.
public event EventHandler<WorkCompleteArgs> WorkComplete;
private void StartClick(object sender, EventArgs e)
{
//hook a complete event
this.WorkComplete += new EventHandler(OnWorkComplete);
//do start code
//run the PerformSynchronousActionUsingWaitHandle process in a thread
Thread thread = new Thread(new ThreadStart(PerformSynchronousActionUsingWaitHandle));
thread.Start();
}
private void OnWorkComplete(object sender, EventArgs e)
{
//cross thread
if (this.InvokeRequired)
{
this.BeginInvoke(new EventHandler(OnWorkComplete), new object[] { sender, e });
return;
}
//un hook
this.WorkComplete -= new EventHandler(OnWorkComplete);
//do complete code
}
private void PerformSynchronousActionUsingWaitHandle()
{
Thread.Sleep(1000);
if (WorkComplete != null)
{
//use event args to return the functions result if needed.
WorkComplete(this, new WorkCompleteArgs(true));
}
}
public class WorkCompleteArgs
{
public WorkState {get;private set;}
public WorkCompleteArgs(bool workState)
{
this.WorkState = workState;
}
}
@Hao Wooi Lim - вы можете настроить аргументы события, чтобы возвращать любые результаты. Я добавил это в код выше.
Есть одна проблема. PerformSynchronousActionUsingWaitHandle () должен возвращать код ошибки. И в этом случае StartClick () должен вернуть этот код ошибки. Итак, StartClick () должен дождаться завершения PerformSynchronousActionUsingWaitHandle () перед возвратом.