Threadsafe控制访问失败。导致控制消失

时间:2018-04-10 03:56:50

标签: c# visual-studio-2015 controls thread-safety

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);
    }
}

现在,如果我打开了设置表单,则只要发生计时器回调,主线程就会显示其消息。

如果设置表单已关闭,则会正确显示第一条消息,但任何后续消息都会导致文本框控件消失(重新打开时发现)。

enter image description here

没有产生错误,所以文本框必须在某处,但它似乎已经失去了与表单的连接。

欢迎任何线索!

添加事件导致行为略有变化。现在将记录所有消息,直到第一次关闭设置表单对话框为止。

以下是一个事件列表:

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). 

1 个答案:

答案 0 :(得分:0)

真正的问题是......

从对话框返回后,将释放对话框窗口的句柄。

解决方案是在ShowDialog !!!

之后重新创建句柄

像这样:

DialogResult diagRes = ShowDialog();
if (!IsHandleCreated) CreateHandle();

问题已解决!