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 +
"
]
"
;
}
}
}

