Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 向Windows GUI线程发送消息_.net_Windows_User Interface_Asynchronous_Message Pump - Fatal编程技术网

.net 向Windows GUI线程发送消息

.net 向Windows GUI线程发送消息,.net,windows,user-interface,asynchronous,message-pump,.net,Windows,User Interface,Asynchronous,Message Pump,我注意到,当您创建一个web服务对象(继承自SoapHttpClientProtocol)并使用Async方法时,它会在Windows GUI线程上进行回调 有人知道这是怎么回事吗 我怎样才能实现同样的目标 我想,如果我确信回调总是发生在GUI线程上,那么这将避免我必须检查GUI表单中所需的invoker。我怀疑它用于静态获取同步上下文。然后,这允许您适当地发布回调。您可以在主线程中创建WindowsFormsSynchronizationContext对象,然后在其他线程上调用其发送方法。。谢

我注意到,当您创建一个web服务对象(继承自SoapHttpClientProtocol)并使用Async方法时,它会在Windows GUI线程上进行回调

  • 有人知道这是怎么回事吗
  • 我怎样才能实现同样的目标

  • 我想,如果我确信回调总是发生在GUI线程上,那么这将避免我必须检查GUI表单中所需的invoker。我怀疑它用于静态获取同步上下文。然后,这允许您适当地发布回调。

    您可以在主线程中创建WindowsFormsSynchronizationContext对象,然后在其他线程上调用其发送方法。

    。谢谢你的回答。这两种选择似乎都有效,而且都有各自的优势

    下面是我用来测试的示例代码:

        public partial class AsyncTest : Form
        {
            static void Main()
            {
                Application.Run(new AsyncTest());
            }
    
            AsyncOperation _operation;
            SynchronizationContext _context;
            TextBox _textBox;
            public AsyncTest()
            {
                _operation = AsyncOperationManager.CreateOperation(null);
                _context = WindowsFormsSynchronizationContext.Current;
                _textBox = new TextBox();
                this.Controls.Add(_textBox);
                new Thread(AsyncThread).Start();
            }
    
            void AsyncThread()
            {
                _operation.Post(GuiThread, null);
                _context.Post(GuiThread, null);
            }
    
            void GuiThread(object state)
            {
                _textBox.Text = _textBox.InvokeRequired ? "Didn't work" : "It Worked";
            }
        }