У меня есть клиент, который создает поток.
Этот поток имеет WaitOne()
, поэтому, пока он застрял там, мой клиент не умирает. Но когда я хочу закрыть свой клиент, мне нужно выполнить Set()
для этого события ручного сброса.
Я объявляю событие ручного сброса в основном классе:
public ManualResetEvent mreIn = new ManualResetEvent(false);
Это моя функция Connect
, которая создает поток с функцией запуска:
public void Connect()
{
objClientThread = new Thread(start) { IsBackground = true };
objClientThread.Start();
}
/// <summary>
/// Starts the client program.
/// </summary>
private void start()
{
//We Open the proxy to let connections happen
objProxy.Open();
if (performHandshake())
{
IsConnected = true;
DelayedShutdownBool = false;
//While connected, the thread keeps the client alive
mreIn.WaitOne();
if (OnShutdownInitiated != null)
{
OnShutdownInitiated(this, new EventArgs());
}
System.Threading.Thread.Sleep(500);
objProxy.Close();
objConfiguration = null;
IsConnected = false;
mreOut.Set();
}
}
И у меня есть обратный вызов, который выполняет Set()
:
Boolean IServiceCallbackContract.Shutdown()
{
mreIn.Set();
return true;
}
Это работает так: все модули инициализируются и блокируются на WaitOne()
. Когда я завершаю работу модуля, обратный вызов выполняет Set()
, но WaitOne()
не разблокируется, и поток не продолжается. Что мне не хватает?
.exe
, выполняемый с помощью executeAssembly. Этот.exe
имеет экземпляр клиентского класса. Когда начинаетсяexe
, вызывается функцияConnect()
, создающая поток - person AAlferez   schedule 16.08.2013