zoukankan      html  css  js  c++  java
  • UI线程同步

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

    }
    }



  • 相关阅读:
    c语言之数据类型
    C语言之概述
    012.day12
    011.day011
    010.day010
    010.day08
    010.周六自习
    009.day07
    008.day06
    007.day05
  • 原文地址:https://www.cnblogs.com/Magicsky/p/2407639.html
Copyright © 2011-2022 走看看