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;
  • 相关阅读:
    Java多线程_同步工具CountDownLatch
    Java多线程_Semaphore信号量
    Java多线程_ReentrantLock
    Java多线程_CAS算法和ABA问题
    Java多线程_Atomic
    Java多线程_生产者消费者模式2
    Java多线程_生产者消费者模式1
    Java多线程_阻塞队列
    Java多线程_wait/notify/notifyAll方法
    Java多线程同步_synchronized
  • 原文地址:https://www.cnblogs.com/xlfj521/p/890508.html
Copyright © 2011-2022 走看看