c#多线程操作UI控件

一、WPF中使用Dispatcher.BeginInvoke

步骤 

使用Thread新建并开始一个线程 

在新建的线程处理函数中需要修改界面的时候获取界面的dispatcher 

使用DispatcherBeginInvoke方法指定一个线程优先级,和一个委托,这个委托时用于修改界面内容的 

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


 

四、异步委托操作BeginInvoke和EndInvoke 

  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(); 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值