一、WPF中使用Dispatcher.BeginInvoke
步骤
使用Thread新建并开始一个线程
在新建的线程处理函数中需要修改界面的时候获取界面的dispatcher
使用Dispatcher的BeginInvoke方法指定一个线程优先级,和一个委托,这个委托时用于修改界面内容的
private void button1_Click(object sender, RoutedEventArgs e)
{
Thread t = new Thread(setNum);
t.Start();
}
private void setNum()
{
label1.Dispatcher.BeginInvoke(DispatcherPriority.Normal,(ThreadStart)delegate()
{
this.label1.Content = DateTime.Now;
});
}
二、WPF中使用Dispatcher.Invoke
private void button1_Click(object sender, RoutedEventArgs e)
{
Thread t = new Thread(setNum);
t.Start();
}
private void setNum()
{
this.label1.Dispatcher.Invoke(new Action(delegate {
this.label1.Content = DateTime.Now;
}));
}
三、invokeRequired属性和 invoke()方法
c#中禁止跨线程直接访问控件,InvokeRequired是为了解决这个问题而产生的
private delegate void setStrDel();
private void button1_Click(object sender, EventArgs e)
{
Thread t = new Thread(setStr);
t.Start();
}
private void setStr()
{
//当一个控件的InvokeRequired属性值为真时,说明有一个创建它以外的线程想访问它
if (label1.InvokeRequired)
{
setStrDel del = new setStrDel(setStr);
label1.Invoke(del);
}
else
{
this.label1.Text = "BC";
}
}
class Program
{
private delegate double threadEvent(double x);
private static threadEvent threadevent;
static double result = 0;
static void Main(string[] args)
{
threadevent = new threadEvent(getNum);
//第一个参数是委托的方法中的参数列表(getNum的参数列表)
//第二个参数是执行的回调函数,如果函数执行完毕。就调用callback的方法执行
//第三个参数一般传这个委托对象
//委托调用BeginInvoke()表示开始执行异步操作
threadevent.BeginInvoke(3.0, TaskFinished, null);
Console.WriteLine(result);//输出0
Console.ReadKey();
}
private static double getNum(double x)
{
return x * Math.PI;
}
private static void TaskFinished(IAsyncResult ir)
{
//EndInvoke,有一个参数列表,一个参数
//参数是IAsyncResult类型,MSDN用几个字描述了:表示异步操作的状态。
//每次都要调用 EndInvoke 来完成异步调用。
//委托调用EndInvoke()表示异步操作执行结束
result =threadevent.EndInvoke(ir);
Console.WriteLine("bc "+result);//输出9.4
}
}
五、BackgroundWorker 异步操作
class Program
{
private static BackgroundWorker bw = new BackgroundWorker();
static void Main(string[] args)
{
//定义需要在子线程中调用的函数
bw.DoWork += new DoWorkEventHandler(print);
//定义执行完毕后调用的函数
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(print1);
bw.RunWorkerAsync();//开始执行
Console.WriteLine("主线程 " + Thread.CurrentThread.ManagedThreadId);
Console.ReadKey();
}
//注意print()与print1()参数列表
private static void print(object sender, DoWorkEventArgs e)
{
Console.WriteLine("子线程中干的事情"+Thread.CurrentThread.ManagedThreadId);
}
private static void print1(object sender, RunWorkerCompletedEventArgs e)
{
Console.WriteLine("执行完毕后做的事情" + Thread.CurrentThread.ManagedThreadId);
}
}
序列化与反序列化
序列化操作
[BinarySerializer]标记在要序列化的类上边
IFormatter formatter = new BinaryFormatter();
创建,获取Stream对象
formatter.Serialize(stream, obj);
stream.Close();
反序列化操作
IFormatter formatter = new BinaryFormatter();
创建,获取Stream对象
MyObject obj = (MyObject) formatter.Deserialize(Stream对象);
stream.Close();