惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
M
MIT News - Artificial intelligence
MyScale Blog
MyScale Blog
博客园_首页
G
Google Developers Blog
博客园 - 【当耐特】
美团技术团队
博客园 - 聂微东
Stack Overflow Blog
Stack Overflow Blog
Vercel News
Vercel News
小众软件
小众软件
博客园 - 司徒正美
雷峰网
雷峰网
T
Tailwind CSS Blog
V
V2EX
博客园 - 三生石上(FineUI控件)
F
Fortinet All Blogs
罗磊的独立博客
量子位
P
Proofpoint News Feed
Microsoft Azure Blog
Microsoft Azure Blog
月光博客
月光博客
A
About on SuperTechFans
Hugging Face - Blog
Hugging Face - Blog

博客园 - 魔幻天空

TFS2012常见问题及解答 作业调度框架 Quartz.NET 2.0 StepByStep(2) 作业调度框架 Quartz.NET 2.0 StepByStep 单机安装“完整”SharePoint 2010 WinDbg / SOS Cheat Sheet 《Dissecting SQL Server Execution Plans》随记 LightSwitch™初体验 .关于 WCF Binding 中 OpenTimeout, CloseTimeout, SendTimeout, ReceiveTimeout 的解释(转载) 轻松掌握用SQL来合并查询 WF4.0 RC 官方示例 Silverlight 3和Expression 3将于7月10日发布 【原】Winfrom的自动更新模块 【转蝈蝈俊.net 】SQL Server 2005 配置发送邮件 [转自MSDN]根据FxCop整理的.NET代码编写规范 谁在TDD 【转】IIS HTTP500错误以及COM+应用程序8004e00f错误的解决方法 每日见闻(一) 【转】30个优秀.net在线学习资源站点 开源许可证简单总结
UI线程同步
魔幻天空 · 2012-03-20 · via 博客园 - 魔幻天空

WINFORM开发中常用的UI线程同步相关代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading.Tasks;
using System.Threading;

namespace ThreadTestApp
{

/// <summary>
/// 线程同步测试
/// </summary>
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void btnInvoke_Click(object sender, EventArgs e)
{
//1.直接调用
OperateUI(DoSomeThing("直接调用"));

//2.同步器调用
var v2 = new Task<string>(() => DoSomeThing("同步器调用"));
v2.Start();
v2.ContinueWith((o) => { OperateUI(o.Result); }, CancellationToken.None,
TaskContinuationOptions.OnlyOnRanToCompletion, TaskScheduler.FromCurrentSynchronizationContext());

//3.异步异常捕捉
var v3 = new Task<string>(() => DoSomeThing("ThrowEx"));
v3.Start();
v3.ContinueWith((o) => { OperateUI(v3.Exception.InnerExceptions[0].Message); }, CancellationToken.None,
TaskContinuationOptions.OnlyOnFaulted, TaskScheduler.FromCurrentSynchronizationContext());

//4.经典UI调用
ThreadPool.QueueUserWorkItem((o) => { Classic(DoSomeThing("经典UI调用")); });

}

private void Classic(string v)
{
if (this.InvokeRequired) //需要找到一个调用控件
{
Action<string> a = new Action<string>(OperateUI);
this.Invoke(a, new object[] { v });
}
else
{
OperateUI(v);
}
}

private void OperateUI(string v)
{

tabDisplay.TabPages.Add(v);

lblDisplay.Text = v;

MessageBox.Show(v);

this.Text = v;
}

private string DoSomeThing(string v)
{
if (v == "ThrowEx")
throw new Exception("自定义异常");

else
return "[" + v + "]";
}

}
}