使用TaskScheduler 调度器 实现跨线程的控件访问

 1         //任务调度器
 2         TaskScheduler UIscheduler = null;
 3         public Form1()
 4         {
 5             //获取任务调度器
 6             UIscheduler = TaskScheduler.FromCurrentSynchronizationContext();
 7             InitializeComponent();
 8         }
 9
10         private void btnTaskScheduler_Click(object sender, EventArgs e)
11         {
12             System.Threading.CancellationTokenSource cts = new System.Threading.CancellationTokenSource();
13             //启动一个任务线程
14             Task<int> t = Task.Run(() =>Sum(100));
15             //使用UIscheduler 调度器 实现跨线程的控件访问
16             t.ContinueWith(task => txtRes.Text = t.Result.ToString(), cts.Token,TaskContinuationOptions.OnlyOnRanToCompletion,UIscheduler);
17             t.ContinueWith(task => txtRes.Text = "Error",System.Threading.CancellationToken.None, TaskContinuationOptions.OnlyOnFaulted,UIscheduler);
18         }
19         private int Sum(int num)
20         {
21             int res = 0;
22             for (int i = 0; i <= num; i++)
23             {
24                 checked { res += i; }
25                 //res += i;
26             }
27             return res;
28         }
时间: 2024-10-11 10:25:27

使用TaskScheduler 调度器 实现跨线程的控件访问的相关文章

C#跨线程操作控件的最简单实现探究

随着程序复杂度的提高,程序不可避免会出现多个线程,此时就很可能存在跨线程操作控件的问题. 跨线程操作UI控件主要有三类方式: 1.禁止系统的线程间操作检查.(此法不建议使用) 2.使用Invoke(同步)或者BeginInvoke(异步).(使用委托实现,并用lambda表达式简化代码) 3.使用BackgroundWorker组件.(此法暂不介绍,详情可见文末的参考资料) 先看一个跨线程操作失败的例子: 新建一个Winform窗口程序项目,拖一个button1和label1控件到Form1窗体

C# 跨线程调用控件

在C# 的应用程序开发中, 我们经常要把UI线程和工作线程分开,防止界面停止响应.  同时我们又需要在工作线程中更新UI界面上的控件, 下面介绍几种常用的方法 阅读目录 线程间操作无效 第一种办法:禁止编译器对跨线程访问做检查 第二种办法: 使用delegate和invoke来从其他线程中调用控件 第三种办法: 使用delegate和BeginInvoke来从其他线程中控制控件 第四种办法: 使用BackgroundWorker组件 源代码下载 线程间操作无效 界面上有一个button和一个la

Winfrom 跨线程更新控件

来源:http://www.cnblogs.com/rainbowzc/archive/2010/09/29/1838788.html 由于多线程可能导致对控件访问的不一致,导致出现问题.C#中默认是要线程安全的,即在访问控件时需要首先判断是否跨线程,如果是跨线程的直接访问,在运行时会抛出异常. 解决办法有两个: 1.不进行线程安全的检查 2.通过委托的方式,在控件的线程上执行 常用写法:(不安全) private void WriteToolStripMsg(string msg, Color

多线程总结之旅(112):跨线程调用控件的几种方式

本来是写完线程池就结束多线程总结之旅系列的,但是想想平时在项目中用到线程仅仅不够的,为什么这么说呢?举个例子:我们有一个函数,它的功能就是加载数据,然后绑定到datagridview.现在我们开启一个线程去执行这个函数.结果可想而知,它会报错:提示线程无法访问...之类的话.为什么报错呢?因为你在开启的线程中操作了datagridview控件,也就是你跨线程调用控件了. 那么我们应该怎么跨线程调用控件呢?下面我就把我总结的几种方法奉献给各位. 跨线程调用控件的几种方法: 1.方法一:Contro

【转载】C# 跨线程调用控件

转自:http://www.cnblogs.com/TankXiao/p/3348292.html 感谢原作者,转载以备后用 在C# 的应用程序开发中, 我们经常要把UI线程和工作线程分开,防止界面停止响应.  同时我们又需要在工作线程中更新UI界面上的控件, 下面介绍几种常用的方法 阅读目录 线程间操作无效 第一种办法:禁止编译器对跨线程访问做检查 第二种办法: 使用delegate和invoke来从其他线程中调用控件 第三种办法: 使用delegate和BeginInvoke来从其他线程中控

C# 跨线程操作控件方法封装

Winform程序需要处理耗时操作时,往往需要将耗时操作放入新开的子线程进行处理,在子线程中可能会经常去修改或操作主线程上的控件: 如果直接在子线程中操作控件,会报线程间操作无效等错误,这里提供一个我自己经常使用的跨线程操作方式,代码如下: //跨线程操作控件 //(将数据全部装填完毕后,在一起放到主界面刷新控件:不要一边装填一边刷新主界面控件,这样依然会导致界面卡顿) public void showMsg(string str) { if (textBox.InvokeRequired) {

C#跨线程操作控件

1.首先通过按键创建子线程: 创建子线程,子线程调用changeText方法. 1 private void btnOK_Click(object sender, EventArgs e) 2 { 3 Thread th = new Thread(changeText); 4 th.Name = "new Thread!"; 5 th.IsBackground = true; 6 th.Start(); 7 } 2.子线程操作弹窗提示: 1 void changeText() 2 {

C# 跨线程对控件赋值

第一种:不对跨线程访问检查,最后输出的结果值不能确定public Form1()        {            InitializeComponent();            // 加入这行            Control.CheckForIllegalCrossThreadCalls = false;        } 第二种:private void button2_Click(object sender, EventArgs e)        {           

.net跨线程调用控件

其实这不是新知识,今天刚好遇到了,就发一贴吧. 有两种方法. 方法一:掩耳盗铃(不推荐) 1 public Form1() 2 { 3 InitializeComponent(); 4 Control.CheckForIllegalCrossThreadCalls = true;//不捕获错误线程的调用 5 } 方法二:调用控件的Invoke方法(推荐) 1 Thread thread = new Thread(() => 2 { 3 textBox1.Invoke(new Action<st