让我描绘一下我的情况:
我有一个创建线程的WCF服务器。该线程执行程序集,我们称之为ABC.exe
。
这个ABC.exe
执行此操作:
static void Main(string[] args)
{
objClientBase.OnHandshakeCompleted += new EventHandler(objClientBase_OnHandshakeCompleted);
objClientBase.OnShutdownInitiated += new EventHandler(objClientBase_OnShutdownInitiated);
objClientBase.Connect();
objOEEMon = new Main();
System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite);
}
Connect
在哪里:
objClientThread = new Thread(start) { IsBackground = true };
objClientThread.Start();
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
while (IsConnected)
{
System.Threading.Thread.Sleep(500);
if (DelayedShutdownBool)
{
System.Threading.Thread.Sleep(500);
objProxy.Close();
objConfiguration = null;
IsConnected = false;
}
}
}
}
此ABC.exe
是使用WCF连接到服务器的客户端。
因此,Sleep(Infinite)
我想使用manualResetEvent
s(或其他内容),而不是让Main()
收到有关Connect
所做的线程结束的通知并结束他的执行。但我不知道如何通知Main
,因为它正在调用创建线程的实例的函数。
我不想要的是有while(condition) sleep
答案 0 :(得分:1)
我的错...我正在传递我的类的新实例而不是当前的实例,因此我的回调是对另一个实例完成的,所以修改的变量不是正确的。
现在完美无缺。 感谢您的回答,他们帮我思考了错误发生在哪里的序列。
答案 1 :(得分:0)
一种解决方案可能是使用Task
类而不是显式创建Thread
//here instead of creating a Thread, create a Task and return it to the caller
objClientThread = new Thread(start) { IsBackground = true };
objClientThread.Start();
然后你可以做
Task task = objClientBase.Connect();
task.Wait();
答案 2 :(得分:0)
如果您想使用手动重置事件,请执行以下操作,声明新的重置事件:
private static ManualResetEvent finished = new ManualResetEvent(false);
等待活动:
//We Open the proxy to let connections happen
objProxy.Open();
if (performHandshake())
{
IsConnected = true;
DelayedShutdownBool = false;
//While connected, the thread keeps the client alive
finished.WaitOne();
if (DelayedShutdownBool)
{
System.Threading.Thread.Sleep(500);
objProxy.Close();
objConfiguration = null;
IsConnected = false;
}
}
然后在objClientBase_OnShutdownInitiated:
finished.Set();