精华内容
下载资源
问答
  • 多个线程竞争读写同一个资源往往会造成意想不到的意外结果,UI界面也是一种资源,所以跨线程修改UI界面往往被加以限制。这里采用Task + MethodInvoker的方式完成跨线程对UI对的修改。
  • 背景 在我做WinForm开发的过程中,经常会遇到耗时操作或阻塞操作...而在Winform中,跨线程修改UI界面同样是不被允许的。在子线程中修改界面控件时Visual Studio会报出如下错误: 解决思路 .Net提供了很多跨..

    背景

    在我做WinForm开发的过程中,经常会遇到耗时操作或阻塞操作。他们会引发软件的卡顿甚至假死,严重影响软件的使用。因此,这类耗时或阻塞的操作一般都会使用异步的方式去执行,不影响主线程(UI线程)与用户间的交互。但多个线程竞争读写同一个资源往往会造成意想不到的意外结果,UI界面也是一种资源,所以跨线程修改UI界面往往被加以限制。而在Winform中,跨线程修改UI界面同样是不被允许的。在子线程中修改界面控件时Visual Studio会报出如下错误:

     

     

    解决思路

    .Net提供了很多跨线程修改UI的方法,每种方法也有与之对应的工具类。我最常用的方法是ThreadPool+ delegate的方式完成跨线程对UI对的修改。

    实例代码

    1、定义委托,把内容写在控件里面

    复制代码

     private delegate void SetLabelDelegate(string value);
    
            private delegate void SetLabelDelegate2(string value);
    
            private void SetText(string value)
            {
                if (this.InvokeRequired)
                {
                    SetLabelDelegate d = new SetLabelDelegate(SetText);
                    this.Invoke(d, new object[] { value });
                }
                else
                {
                    txtbigcrmresult.Text = value.ToString() + txtbigcrmresult.Text;
                }
            }

    复制代码

     

    
     

    2、定义方法,线程调用

    复制代码

    private void button3_Click(object sender, EventArgs e)
            {
                ThreadPool.QueueUserWorkItem(new WaitCallback(dao), "test");
            }
      private void dao(object url)
            {
                IDbConnection conn = new SqlConnection(txtbigcrmui.Text);
                SetText("\r\n" + "start");
              .........................
                SetText("\r\n" + "end");
            }

    复制代码

     

     

    3、更新ui控件 

     SetText("\r\n" + "start");

     

     

    总结

    1、使用delegate实现跨线程更新UI;

    2、使用ThreadPool实现多线程执行方法,避免卡顿;

     

    展开全文
  • 背景 在我做WinForm开发的过程中,经常会遇到耗时操作或...而在Winform中,跨线程修改UI界面同样是不被允许的。在子线程中修改界面控件时Visual Studio会报出如下错误: 解决思路 .Net提供了很多跨线程修改UI的方法,

    背景
    在我做WinForm开发的过程中,经常会遇到耗时操作或阻塞操作。他们会引发软件的卡顿甚至假死,严重影响软件的使用。因此,这类耗时或阻塞的操作一般都会使用异步的方式去执行,不影响主线程(UI线程)与用户间的交互。但多个线程竞争读写同一个资源往往会造成意想不到的意外结果,UI界面也是一种资源,所以跨线程修改UI界面往往被加以限制。而在Winform中,跨线程修改UI界面同样是不被允许的。在子线程中修改界面控件时Visual Studio会报出如下错误:

    在这里插入图片描述

    解决思路
    .Net提供了很多跨线程修改UI的方法,每种方法也有与之对应的工具类。我最常用的方法是ThreadPool+ delegate的方式完成跨线程对UI对的修改。

    实例代码
    1、定义委托,把内容写在控件里面

    private delegate void SetLabelDelegate(string value);
     
        private delegate void SetLabelDelegate2(string value);
     
        private void SetText(string value)
        {
          if (this.InvokeRequired)
          {
            SetLabelDelegate d = new SetLabelDelegate(SetText);
            this.Invoke(d, new object[] { value });
          }
          else
          {
            txtbigcrmresult.Text = value.ToString() + txtbigcrmresult.Text;
          }
        }
    

    2、定义c#教程方法,线程调用

    private void button3_Click(object sender, EventArgs e)
        {
          ThreadPool.QueueUserWorkItem(new WaitCallback(dao), "test");
        }
     private void dao(object url)
        {
          IDbConnection conn = new SqlConnection(txtbigcrmui.Text);
          SetText("\r\n" + "start");
         .........................
          SetText("\r\n" + "end");
        }
    private void button3_Click(object sender, EventArgs e)
        {
          ThreadPool.QueueUserWorkItem(new WaitCallback(dao), "test");
        }
     private void dao(object url)
        {
          IDbConnection conn = new SqlConnection(txtbigcrmui.Text);
          SetText("\r\n" + "start");
         .........................
          SetText("\r\n" + "end");
        }
    

    3、更新ui控件

    1
    SetText("\r\n" + “start”);
    总结
    1、使用delegate实现跨线程更新UI;

    2、使用ThreadPool实现多线程执行方法,避免卡顿;

    以上就是C#-WinForm跨线程修改UI界面的示例的详细内容

    展开全文
  • C#-WinForm跨线程修改UI界面(task)

    千次阅读 2020-06-11 16:47:31
    https://blog.csdn.net/lgj123xj/article/details/78533400 待解决的问题 在我做WinForm开发的过程中,经常会遇到耗时操作或阻塞操作。他们会引发软件的卡顿甚至假死,严重影响软件的使用。 因

    https://blog.csdn.net/lgj123xj/article/details/78533400

    待解决的问题

    在我做WinForm开发的过程中,经常会遇到耗时操作或阻塞操作。他们会引发软件的卡顿甚至假死,严重影响软件的使用。
    因此,这类耗时或阻塞的操作一般都会使用异步的方式去执行,不影响主线程(UI线程)与用户间的交互。但多个线程竞争读写同一个资源往往会造成意想不到的意外结果,UI界面也是一种资源,所以跨线程修改UI界面往往被加以限制。

    例如在Android 4.0之后,UI线程内不允许执行网络请求,网络请求需要配合着如AsyncTask之类的工具类来完成。

    而在Winform中,跨线程修改UI界面同样是不被允许的。在子线程中修改界面控件时Visual Studio会报出如下错误:

    “System.InvalidOperationException”类型的异常在 System.Windows.Forms.dll 中发生,但未在用户代码中进行处理
    其他信息: 线程间操作无效: 从不是创建控件“progressBar1”的线程访问它。

    VS报错
    .Net提供了很多跨线程修改UI的方法,每种方法也有与之对应的工具类。我最常用的方法是Task + MethodInvoker的方式完成跨线程对UI对的修改(个人觉得这种方法写起来比较简洁)。

    实例代码

    界面设计

    界面上只有一个按钮和一个进度条:
    界面的设计

    源代码

    public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                progressBar1.Maximum = 100;
                progressBar1.Minimum = 0;
                progressBar1.Value = 0;
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                Task task = new Task(() =>
                {
                    //*****以下是异步执行的代码*****
                    int i=0;
                    while(++i<100){
                        Thread.Sleep(30);//模拟耗时操作
                        MethodInvoker mi = new MethodInvoker(() =>
                        {
                            progressBar1.Value = i;
                        });
                        this.BeginInvoke(mi);
                    }
                    //*****以上是异步执行的代码*****
                });
                task.Start();
            }
    
        }
    

    运行效果

    执行效果

    下载链接

    如果还有什么不清楚的地方,可以下载项目文件查看源代码并执行,下载地址:http://download.csdn.net/download/lgj123xj/10118502

    展开全文
  • C# winform跨线程操作UI exception 在我们做WinForm开发的过程中,经常会遇到耗时...但多个线程竞争读写同一个资源往往会造成意想不到的意外结果,UI界面也是一种资源,所以跨线程修改UI界面往往被加以限制。 ...

    C# winform跨线程操作UI exception

     

    在我们做WinForm开发的过程中,经常会遇到耗时操作或阻塞操作。他们会引发软件的卡顿甚至假死,严重影响软件的使用。 
    因此,这类耗时或阻塞的操作一般都会使用异步的方式去执行,不影响主线程(UI线程)与用户间的交互。但多个线程竞争读写同一个资源往往会造成意想不到的意外结果,UI界面也是一种资源,所以跨线程修改UI界面往往被加以限制。
     

    Additional information: Cross-thread operation not valid: Control '' accesse

    常见的处理方式可以采用委托!

    这里我提供一个简单解决方案,因为我的程序比较简单就一个小窗口程序,不是很复杂,不会有其他影响,用委托相对比较麻烦了!

    我的解决方法:

    在MainWindow的InitializeComponent()函数中添加以下语句

    System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;

    其他参考文章:

    https://www.cnblogs.com/lusunqing/p/3161789.html

    展开全文
  • WPF:谈谈各种多线程修改或访问UI线程数据的方法http://www.cnblogs.com/mgen/archive/2012/03/10/2389509.html 子线程非法访问UI线程的数据,会产生如下错误: InvalidOperationException:The calling ...
  • 在vs2003下,使用子线程调用ui线程创建的控件的属性是不会有问题的,但是编译的时候会出现警告,但是vs2005及以上版本就会有这样的问题,下面是msdn上的描述 "当您在 Visual Studio 调试器中运行代码时,如果您从一个...
  • 之前在做winform应用的时候,使用多线程控制界面上控件信息,时常碰到...这是因为.net 2.0以后加强了安全机制,不允许在winform中直接跨线程访问控件的属性。参照网上的例子,自己总结了一下解决的方法:  一.我...
  • 小伙伴们在做winform开发时,如果在子线程中去设置主线程中UI控件的属性,会出现“跨线程调用异常”。如何解决呢? 二、解决思路 比如我们的winform控件是一个TextBox,名字是tbResult,现在需要在子线程中,修改其...
  • winform开发过程中经常遇到使用异步线程修改界面的情况,这个时候会报一个跨线程操作的错误,这个时候需要Invoke方式 if (this.InvokeRequired) { this.Invoke(new Action(() => { // 具体的方法内容 这里...
  • 首先就从一个实验开始说起吧。在VS中建一个WinForm的工程,在界面上就放一个Label和一个Button,然后为按钮添加一个点击事件,修改代码如下: private void button1_Click(object sender, EventA
  • class GClock:Form ... #region 跨线程更新UI控件 private delegate void UpdataTextDelegate(Label myControl, string myArg); /// /// 由 UpdataTextDelegate 委托实例调用,跨线程更新UI方法
  • C#跨线程操作控件

    2018-09-26 11:32:52
    WinForm中使用多线程时,常常遇到一个问题,当在子线程(非UI线程)中修改一个控件的值:比如修改进度条进度,时会抛出如下错误 Cross-thread operation not valid: Control ‘XXX’ accessed from a thread ...
  • .Net线程问题解答

    2010-09-21 16:22:00
    基础篇怎样创建一个线程 受托管的线程与 Windows线程 前台线程与后台线程 名为BeginXXX和EndXXX的方法是做... 为什么Winform不允许跨线程修改UI线程控件的值 有没有什么办法可以简化WinForm多线程的开发
  • .Net 多线程详解

    2008-10-31 09:50:10
    • 为什么Winform不允许跨线程修改UI线程控件的值 • 有没有什么办法可以简化WinForm多线程的开发 线程池 • 线程池的作用是什么? • 所有进程使用一个共享的线程池,还是每个进程使用独立的线程池? • 为什么...
  • .net 线程详解 基础篇

    2008-01-07 08:33:21
    * 为什么Winform不允许跨线程修改UI线程控件的值 * 有没有什么办法可以简化WinForm多线程的开发 线程池 * 线程池的作用是什么? * 所有进程使用一个共享的线程池,还是每个进程使用独立的线程池? * 为什么不要...
  • • 为什么Winform不允许跨线程修改UI线程控件的值 • 有没有什么办法可以简化WinForm多线程的开发 线程池 • 线程池的作用是什么? • 所有进程使用一个共享的线程池,还是每个进程使用独立的线程池? • 为什么...
  • C#子线程中更新ui

    2018-01-24 15:11:00
    本文实例总结了C#子线程更新UI控件的方法,对于桌面应用程序设计的UI界面控制来说非常有实用价值。分享给大家供大家参考之用。...跨线程更新UI控件的常用方法有两种: 1.使用控件自身的invoke/BeginInv...
  • 跨线程更新UI控件的常用方法有两种: 1.使用控件自身的invoke/BeginInvoke方法 2.使用SynchronizationContext的Post/Send方法更新 具体实现如下: 1.使用控件自身的invoke/BeginInvoke方法 Control类实现了ISyn
  • 跨线程更新UI控件的常用方法有两种: 1.使用控件自身的invoke/BeginInvoke方法 2.使用SynchronizationContext的Post/Send方法更新 1、使用控件自身的invoke/BeginInvoke方法 Control类实现了ISynchron...

空空如也

空空如也

1 2
收藏数 37
精华内容 14
关键字:

winform跨线程修改ui