• 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;
        }
    }
  • 相关阅读:
    生成4位随机验证码工具类
    MD5加随机盐工具类
    Excel文件解析工具类
    实践作业4:Web测试实践(小组作业)记录4
    实践作业4:Web测试实践(小组作业)记录3
    实践作业4:Web测试实践(小组作业)记录2
    实践作业4:Web测试实践(小组作业)记录1
    实践作业3:白盒测试实践(小组作业)记录3
    实践作业3:白盒测试实践(小组作业)记录2
    实践作业3:白盒测试实践(小组作业)记录1
  • 原文地址:https://www.cnblogs.com/zhchsh/p/5262332.html
Copyright © 2020-2023  润新知