zoukankan      html  css  js  c++  java
  • winform 跨线程操作控件

    当进行winform的开发时,经常遇到用时比较久的操作,在传统的单线程程序中,用户必须等待这个耗时操作完成以后才能进行下一步的操作,这个时候,多线程编程就派上用场了,将这个耗时的操作放到一个新的子线程中,启动子线程完成操作,而不影响主线程的正常工作。

    那么这个时候问题来了,当在子线程中需要操作界面上控件的参数时就不能简单的操作控件参数了,因为这会引起跨线程安全错误(子线程不是控件的初始化线程),具体原因不多讲,下面讲一下怎么解决子线程操作主线程控件的问题:

    具体代码如下:

    //0初始;1导入2暂停3恢复4终止
    private void ButtonState(int state)
    {
        switch (state)
        {
            case 0:
                btnImport.Enabled = true;
                btnSuspend.Enabled = false;
                btnResume.Enabled = false;
                btnInterrupt.Enabled = false;
                break;
            case 1:
                btnImport.Enabled = true;
                btnSuspend.Enabled = true;
                btnResume.Enabled = false;
                btnInterrupt.Enabled = true;
                break;
            case 2:
                btnImport.Enabled = true;
                btnSuspend.Enabled = false;
                btnResume.Enabled = true;
                btnInterrupt.Enabled = true;
                break;
            case 3:
                break;
            case 4:
                break;
        }
    }
    //界面按钮事件
    private void btnImport_ItemClick(object sender, ItemClickEventArgs e)
    {
        ButtonState(1);
        ImportThread = new Thread(new ThreadStart(MyThread));
        ImportThread.Start();
        msIsAliveThreadName = "ImportThread";
    }
    //线程函数
    private void MyThread()
    {
        //其他操作
        FormState(0);
    }
    
    public void FormState(int formState)
    {
        if (InvokeRequired)
        {
            System.EventArgs e = new MyEvents(formState);
            object[] pList = { this, e };
            //通过委托运行事件
            BeginInvoke(new MyEventsHandler(UpdateUI_ButtonState), pList);
        }
        else
        {
            //非挂线程修改
        }
    }
    
    //事件委托
    private delegate void MyEventsHandler(object sender, MyEvents e);
    
    //事件函数
    private void UpdateUI_ButtonState(object sender, MyEvents e)
    {
        this.ButtonState(e.FormState);
    }
    //事件参数
    public class MyEvents : EventArgs
    {
        public int FormState;
        public MyEvents(int formState)
        {
            FormState = formState;
        }
    }
  • 相关阅读:
    Arthas线上问题排查
    如何快速增加pdf书签,解除pdf限制
    数组指针——指向数组的指针(通过指针控制数组)
    指针和数组直接对应关系之如何记忆
    C/C++语言中指针数组和数组指针比较区别
    int最大值+1为什么是-2147483648最小值-1为什么是2147483647
    电脑进行二进制加减运算方法
    C/C++语言中的函数参数传参三种对比
    Python基于VS2013 开发环境搭建 Hello World 10分钟搞定
    算法的复杂度包括时间复杂度和空间复杂度分别如何计算?
  • 原文地址:https://www.cnblogs.com/zhchsh/p/5262332.html
Copyright © 2011-2022 走看看