C#实现跨线程操作控件方法

2019-12-26 12:27:10王冬梅

本实例实现的功能是:点击button控件,开启socket监听服务。监听的端口需要从UI界面中的textbox中获取,因为不是创建它的线程访问它,因此才有Dispatcher.Invoke异步操作。稍作补充:在开启监听的过程中,有while(true)死循环,将其直接放入到主线程都会导致线程无法正常进行下去,解决方法是开启一个新的线程来开启监听。

 

复制代码 private void button1_Click(object sender, RoutedEventArgs e)
{
    Thread thread = new Thread(new ThreadStart(StartServer));
    thread.Start();
}

 

public void StartServer()
{
    int port = Convert.ToInt32(GetText(this.tbPort));
    ServerSocket serverSocket = new ServerSocket(port);
    serverSocket.Start();
}

private delegate string GetTextHandle(Control control);
private string GetText(Control control)
{
    if (this.Dispatcher.Thread != System.Threading.Thread.CurrentThread)
    {
 return (string)this.Dispatcher.Invoke(new GetTextHandle(this.GetText), control);
    }
    else
    {
 if (control.GetType() == typeof(TextBox))
 {
     return ((TextBox)control).Text;
 }
 else
 {
     return string.Empty;
 }
    }
}

 

总结:

由上述几个实例可以看到跨线程调用需要使用Invoke和BeginInvoke(暂时没有用到),在一些要求并不是很严格的系统中,暂且认为二者是可以通用的。感兴趣的朋友可以测试运行一下。通过实践会收获的更多!

希望本文所述对大家的C#程序设计有所帮助。