精华内容
下载资源
问答
  • 背景 在我做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);    
    展开全文
  • 之前在做winform应用的时候,使用多线程控制界面上控件信息,时常碰到InvalidOperationException这个异常!这个异常的出现多数情况是由于worker线程(子线程)修改主线程控件(或对象)的属性而导致的非法操作。这是因为...

      之前在做winform应用的时候,使用多线程控制界面上控件信息,时常碰到InvalidOperationException这个异常!这个异常的出现多数情况是由于worker线程(子线程)修改主线程控件(或对象)的属性而导致的非法操作。这是因为.net 2.0以后加强了安全机制,不允许在winform中直接跨线程访问控件的属性。参照网上的例子,自己总结了一下解决的方法:

       一.我们在窗体加载的时候Form1_Load()方法中加一句代码:

    private void TESTThreadForm _Load(object sender, EventArgs e)
    {
    Control.CheckForIllegalCrossThreadCalls = false;
    Thread thread = new Thread(ThreadFunc);
    thread.IsBackground = true;
    thread.Start();
    }

       加入这句代码以后发现程序可以正常运行了。这句代码就是说在这个类中我们不检查跨线程的调用是否合法(如果没有加这句话运行也没有异常,那么说明系统以及 默认的采用了不检查的方式)。然而,从安全性方面看,这种方法不可取。CheckForIllegalCrossThreadCalls容许子线程随时更新ui,在同一个函数体内,不能保证自身事务的一致性。如给lable赋值,可能一回头,就已经给别人修改了,当然你可以自己加锁,用信号量,但工作量又多了,而且如果在项目中多处需要跨纯种访问控件,那就要重复又重复添加!我们要采取另外的方案。

      二.方案二是使用delegate和invoke来从其他线程中控制控件信息。

    public partial class TESTThreadForm : Form
    {
    private delegate void ProxyClient();//代理
    public Form1()
    {
    InitializeComponent();
    }
    private void Form1_Load(object sender, EventArgs e)
    {
    Thread thread = new Thread(CrossThreadFlush);
    thread.IsBackground = true;
    thread.Start();
    }
    private void CrossThreadFlush()
    {
    while (true)
    {
    //将sleep和无限循环放在等待异步的外面
    Thread.Sleep(1000);
    ThreadFunction();
    }
    }
    private void ThreadFunction()
    {
    if (this.textBox1.InvokeRequired)//等待异步
    {
    FlushClient fc = new ProxyClient(ThreadFunction);
    this.Invoke(fc);//通过代理调用刷新方法
    }
    else
    {
    this.textBox1.Text = DateTime.Now.ToString();
    }
    }
    }

      用第二种方案,我们可以解决了跨纯种访问控件的属性和信息,通过等待异步,不需要总是持有主线程的控制,这样就可以在不发生跨线程调用异常的情况下完成多线程对winform多线程控件的控制了。

    转载于:https://www.cnblogs.com/Michael-Kong/archive/2012/05/29/2524807.html

    展开全文
  • WinForm线程修改界面

    2020-05-06 11:20:20
    线程函数如下: private void fun() { int x = 0; while (true) { if (x > 100) { x = 0; } this.Invoke(new Action(delegate { tool...

    线程函数如下: 

    private void fun()
    {
        int x = 0;
        while (true)
        {
            x++;
            
            if (x > 100)
            {
                x = 0;
            }
    
            this.Invoke(new Action(delegate
            {
                toolStripProgressBar1.Value = x;  //更新进度条,传入是int型,且要求[0,100]
            }));
    
            Thread.Sleep(1000);
        }
    }

    关闭程序最好加入以下程序段:

    private void Form1_FormClosed(object sender, FormClosedEventArgs e)
    {
        System.Environment.Exit(0);
    }

     

     

    展开全文
  • 多个线程竞争读写同一个资源往往会造成意想不到的意外结果,UI界面也是一种资源,所以跨线程修改UI界面往往被加以限制。这里采用Task + MethodInvoker的方式完成跨线程对UI对的修改。
  • 背景 在我做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界面的示例的详细内容

    展开全文
  • 我们可以使用invoke和bengininvoke invoke同步执行一个委托 begininvoke异步执行一个委托 转载于:https://www.cnblogs.com/birdofparadise/p/7079113.html
  • vs2005 ,工作线程 操作 界面线程的时候,一般会 报个错误,叫 么子 工作线程不能够修改主线程什么的。解决方法参考如下: #region 重新加载树图 /// /// 重新加载树图 /// private void RedrawTree() { ...
  • C#-WinForm线程修改UI界面(task)

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

    千次阅读 2016-04-29 03:11:29
    winform异步线程防止界面卡死
  • c# winform编程之多线程ui界面资源修改总结篇
  • Winform 线程

    2019-10-04 04:43:27
    1. 理解“Windows 窗体应用程序”项目Program.cs文件的main方法与传统C++Console控制台程序的main方法的...从程序运行层次上讲,两者无区别,都是程序的入口点,属于进程的第一个线程。前者隐藏了UI应用...
  • 前言 多线程刷新界面主要用到多线程,委托,线程安全、... 在开发软件时经常会需要更新界面上的某个控件来显示相关的信息,为了让程序执行不出现界面卡死的现像,最好的方法就是“多线程+委托”来解决。 控件:...
  • WinForm线程监控

    千次阅读 2015-07-24 17:11:06
    C#禁止跨线程直接访问控件,InvokeRequired是为了解决这个问题而产生的,当一个控件的InvokeRequired属性值为真时,说明有一个创建它以外的线程想访问它。此时它将会在内部调用new MethodInvoker(LoadGlobalImage...
  • c# winform编程之多线程ui界面资源修改总结篇 单线程的winfom程序,设置一个控件的值是很easy的事情,直接 this.TextBox1.value = "Hello World!";就搞定了,但是如果在一个新线程中这么做,比如: ...
  • 今天给项目里写一个守护程序,需要开多线程做一些数据处理,DBA说需要界面显示当前工作状态。大家都知道,由于窗口多开的线程,跟窗口不是一个线程,不能直接控制窗口,否则会导致锁死窗口。所以,实现这个效果需要...
  • 通行要求在线程里不要修改界面的显示内容,如果非要修改通常的方法是: 1. 使用BeginInvoke(),添加委托的方式。 告诉线程处理时,BeginInvoke的内容要在其他线程里实现。 2. 使用async , await, 允许当前的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,276
精华内容 1,310
关键字:

winform线程中修改界面