C#VS 2015 CE
我创建了一个系统托盘应用程序,它使用设置对话框的表单。相同的表单有一个用于记录消息的多行文本框。
主线程上的定时器回调将消息附加到文本框日志。
以下是设置表单中的线程安全代码:
delegate void SetTextCallBack(string message);
private void SetLogText(string text)
{
if (textBoxLog.InvokeRequired)
{
SetTextCallBack d = new SetTextCallBack(SetLogText);
textBoxLog.Invoke(d, new object[] { text });
}
else
{
if (!textBoxLog.Text.Equals("")) textBoxLog.AppendText(Environment.NewLine);
textBoxLog.AppendText(text);
}
}
现在,如果我打开了设置表单,则只要发生计时器回调,主线程就会显示其消息。
如果设置表单已关闭,则会正确显示第一条消息,但任何后续消息都会导致文本框控件消失(重新打开时发现)。
没有产生错误,所以文本框必须在某处,但它似乎已经失去了与表单的连接。
欢迎任何线索!
添加事件导致行为略有变化。现在将记录所有消息,直到第一次关闭设置表单对话框为止。
以下是一个事件列表:
Textbox Log Visibly Changed ' App First Started and first message written by MAIN() Form instaniated but not displayed
SetTextCallback: Appending Text
Textbox Log Visibly Changed
Textbox Log Text Changed
Timer Entered ' First timer event. 2 Messages written
SetTextCallback: Invoking
SetTextCallback: Appending Text
Textbox Log Text Changed
Textbox Log Text Changed
SetTextCallback: Invoking
SetTextCallback: Appending Text
Textbox Log Text Changed
Textbox Log Text Changed
Callback in 60 seconds
Timer Entered ' Second timer event. 2 Messages written
SetTextCallback: Invoking
SetTextCallback: Appending Text
Textbox Log Text Changed
Textbox Log Text Changed
SetTextCallback: Invoking
SetTextCallback: Appending Text
Textbox Log Text Changed
Textbox Log Text Changed
Callback in 60 seconds
Timer Entered ' Third timer event. 2 Messages written
SetTextCallback: Invoking
SetTextCallback: Appending Text
Textbox Log Text Changed
Textbox Log Text Changed
SetTextCallback: Invoking
SetTextCallback: Appending Text
Textbox Log Text Changed
Textbox Log Text Changed
Callback in 60 seconds
Textbox Log Visibly Changed ' Settings Form entered by user (ShowDialog) all 7 messages visible
Timer Entered ' Forth timer event. 2 Messages written Setting form still open. New messages seen appended.
SetTextCallback: Invoking
SetTextCallback: Appending Text
Textbox Log Text Changed
Textbox Log Text Changed
SetTextCallback: Invoking
SetTextCallback: Appending Text
Textbox Log Text Changed
Textbox Log Text Changed
Callback in 60 seconds
Timer Entered ' Fifth timer event. 2 Messages written. Setting form still open. New messages seen appended.
SetTextCallback: Invoking
SetTextCallback: Appending Text
Textbox Log Text Changed
Textbox Log Text Changed
SetTextCallback: Invoking
SetTextCallback: Appending Text
Textbox Log Text Changed
Textbox Log Text Changed
Callback in 60 seconds ' Return from setting form dialog
Timer Entered ' Sixth timer event. 2 Messages written
SetTextCallback: Appending Text ' The safe thread method is no longer calling the Invoke
Textbox Log Visibly Changed ' Re-enter setting form. log textbox is now missing.
Textbox Log Text Changed
Textbox Log Text Changed
SetTextCallback: Appending Text
Textbox Log Text Changed
Textbox Log Text Changed
Callback in 60 seconds ' Return from setting form dialog again
Textbox Log Visibly Changed
Timer Entered ' Seventh timer event. 2 Messages written
SetTextCallback: Invoking ' Invoke is re-occuring but callback is never fired
SetTextCallback: Invoking ' Invoke is re-occuring but callback is never fired
Callback in 60 seconds
The program '[0x1458] SystemTrayApp.vshost.exe' has exited with code 0 (0x0).
答案 0 :(得分:0)
真正的问题是......
从对话框返回后,将释放对话框窗口的句柄。
解决方案是在ShowDialog !!!
之后重新创建句柄像这样:
DialogResult diagRes = ShowDialog();
if (!IsHandleCreated) CreateHandle();
问题已解决!