zoukankan      html  css  js  c++  java
  • C#多线程操作界面控件的解决方案

     C#2005后不再支持多线程直接访问界面的控件(界面创建线程与访问线程不是同一个线程),不过可以使用delegate来解决:

    1. 声明一个delegate和定义一个delegate的实现函数
    delegate void ShowProgressDelegate(int newPos);
    private void ShowProgress(int newPos)
    {
    // 判断是否在线程中访问
    if (!_progressBar.InvokeRequired)
    {
    // 不是的话直接操作控件
    _progressBar.Value = newPos;
    }
    else
    {
    // 是的话启用delegate访问
    ShowProgressDelegate showProgress = new ShowProgressDelegate(ShowProgress);
    // 如使用Invoke会等到函数调用结束,而BeginInvoke不会等待直接往后走
    this.BeginInvoke(showProgress, new object[] { newPos });
    }
    }

    2. 定义线程函数(在另一个线程中可以对界面控件进读操作)
    private void ProgressStart()
    {
    while (true)
    {
    int newPos = _progressBar.Value + 10;

    if (newPos > _progressBar.Maximum)
    {
    newPos = _progressBar.Minimum;
    }
    Trace.WriteLine(string.Format("Pos: {0}", newPos));

    // 这里直接调用方法,由其内部自动判断是否启用delegate
    ShowProgress(newPos);
    Thread.Sleep(100);
    }
    }

    3. 线程的启动和终止
    private Thread _progressThread;
    _progressThread = new Thread(new ThreadStart(ProgressStart));
    // 可选,功用:即使该线程不结束,进程也可以结束
    _progressThread.IsBackground = true;
    _progressThread.Start();

    _progressThread.Abort();
    // 可选,功用:等到线程结束才继续
    _progressThread.Join();
    _progressThread = null;
  • 相关阅读:
    javascript继承对象冒充
    javascript原型prototype(2)
    javascript继承call()和apply实现继承
    javascript继承原型链继承
    javascript原型prototype(3)
    没有宽高的情况下实现水平垂直居中
    TCP协议
    什么是模块化?模块化的好处是什么?
    数组中嵌套数组,转化为一个数组形式/二维数组转化为一维数组
    常见的请求头类型
  • 原文地址:https://www.cnblogs.com/xlfj521/p/890508.html
Copyright © 2011-2022 走看看