【问题标题】:UI operations from TcpClient DataReadAsyncCallback来自 TcpClient DataReadAsyncCallback 的 UI 操作
【发布时间】:2012-06-24 18:39:04
【问题描述】:

TcpClient DataReadAsyncCallback 是否在主 UI 线程中执行? 我正在从该处理程序创建 Windows 窗体,经过几次调用和窗口显示应用程序只是终止,没有任何来自 .NET 的异常。

...
ns.BeginRead(client.RxPacket, 0, client.RxPacket.Length, new AsyncCallback(TcpClientDataReadAsyncCallback), client);
...

private void TcpClientDataReadAsyncCallback(IAsyncResult ar)
{
    Client client = (Camera)ar.AsyncState;

    // read data 
    // create window form with that data recieved

    MyForm form = new MyForm(/*read data passed*/);
    form.Show(); 
}

或者我应该使用委托来跟踪来自另一个线程的 UI 访问?

【问题讨论】:

    标签: c# multithreading asynchronous tcpclient


    【解决方案1】:

    最好的办法是检查是否需要调用:

            MyForm form = new MyForm(/*read data passed*/);
            if (form.InvokeRequired)
                form.Invoke(new MethodInvoker(() => form.Show()));
            else
                form.Show();
    

    【讨论】:

    • InvokeRequired 在调试代码时返回 false,在 Show() 调用调试器关闭应用程序后立即关闭应用程序,除了 mscorlib.dll 中的输出窗口 InvalidOperationException 和 system.dll 中的 ObjectDisposedException 之外没有产生任何错误
    • 我认为问题在于如何从另一个线程创建窗体
    猜你喜欢
    • 1970-01-01
    • 2016-01-18
    • 1970-01-01
    • 2013-10-06
    • 1970-01-01
    • 1970-01-01
    • 2015-12-16
    • 1970-01-01
    相关资源
    最近更新 更多