我有一个创建线程的客户端。
那个帖子有一个WaitOne()
所以当它被卡在那里我的客户端不会死。
但是当我想关闭我的客户端时,我需要对该手动重置事件进行Set()
。
我在主类中声明手动重置事件:
public ManualResetEvent mreIn = new ManualResetEvent(false);
这是我的Connect
函数,它使用start函数创建线程:
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()
未解锁且线程不会继续。
我错过了什么?
答案 0 :(得分:2)
问题在于,当我创建服务客户端时,我不得不传递回调的instace上下文,而我正在执行new
所以我没有放置current
实例上下文和回调正在对其他实例进行,因此我正在进行的值或事件的每次更改都没有反映在当前的intance中。
感谢@HenkHolterman的帮助:)
答案 1 :(得分:0)
看起来你正在以正确的方式使用ManualResetEvent。但是,你的主题是背景。如果所有其他非后台线程退出,则您的线程将在随机位置中止,mreIn.WaitOne()
之后的代码可能无法执行。
如果是这种情况,那么让你的therad非背景会解决这个问题。
答案 2 :(得分:0)
请注意以下示例:
response.getOutputStream().println(mapper.writeValueAsString(data));