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;
  • 相关阅读:
    2016年3月3日
    性能测试之我解
    Vim命令合集
    vi-vim常用命令
    架构的本质是
    网站三层架构学习之一 分层式结构
    Spring 4 + Quartz 2.2.1 Scheduler Integration Example
    “城市民族工作条例”详解--建议废止
    字符串匹配处理
    LogBack简易教程
  • 原文地址:https://www.cnblogs.com/xlfj521/p/890508.html
Copyright © 2011-2022 走看看