zoukankan      html  css  js  c++  java
  • C#异步和委托

     

    以上两种显示方法都实现返回值写法,无返回值两种方法基本无区别。

    由执行时间结果看出,异步可以直接结束主线程,方法也不需要主线程处理过多的代码。

    委托需要在主线程编写代码,并且写法有些复杂。

    using System;using System.Threading;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace AsyncAwait
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
    
            }
            private void Form1_Load(object sender, EventArgs e)
            {
                Control.CheckForIllegalCrossThreadCalls = false;
            }
    
            private void btclear_Click(object sender, EventArgs e)
            {
                tbshow.Text = "";
            }
            private void showMsg(string sMsg)
            {
                tbshow.Text += Thread.CurrentThread.ManagedThreadId + sMsg + DateTime.Now.ToString() + "
    ";
            }
    
            private void btRun_Click(object sender, EventArgs e)
            {
                //异步,分线程处理,多次点击,还可以等待返回结果。
                asyncTask();
                showMsg("btRun_asyncTaskClick.end..");
            }
            public async void asyncTask()
            {
                string x = await asyncTask2();
                showMsg(x);
                Thread.Sleep(1000);
                showMsg("asyncTask.end");
            }
            public async Task<string> asyncTask2()
            {
                return await Task.Run(() =>
                {
                    //模拟一个超大工作量的进程
                    showMsg("run..BeginInvoke.start.");
                    Random rd = new Random();
                    Thread.Sleep(rd.Next(3000, 6000));
                    showMsg("run..BeginInvoke.end.");
                    return "返回值:asyncTask2End" + DateTime.Now.ToString();
                });
            }
            public delegate void MainFun(string a,out string b);
            private void btInvoke_Click(object sender, EventArgs e)
            {
                string sReturn = "";
                //委托当执行EndInvoke时,线程被锁死了,无法多次点击
                MainFun myMainFun = new MainFun(BeginInvoke);
                IAsyncResult myIAsyncResult = myMainFun.BeginInvoke("a", out sReturn, null, null);
                myMainFun.EndInvoke(out sReturn,myIAsyncResult);
                showMsg(sReturn);
                Thread.Sleep(1000);
                showMsg("runInvoke.end..");
            }
            public void BeginInvoke(string a,out string b)
            {
                //模拟一个超大工作量的进程
                showMsg("run..BeginInvoke.start.");
                Random rd = new Random();
                Thread.Sleep(rd.Next(3000, 6000));
                showMsg("run..BeginInvoke.end.");
                b = "返回值:BeginInvokeEnd" + DateTime.Now.ToString();
            }
    
            private void btrun2_Click(object sender, EventArgs e)
            {
                string sReturn = "";
                BeginInvoke("a",out sReturn);
                showMsg("run.end..");
            }
        }
    }
  • 相关阅读:
    selenium+phantomjs爬取bilibili
    使用 python 开发 Web Service
    OBIEE 立方刷新的问题
    解析OracleOLAP使用MView刷新Cube
    Codeforces Round #755 (Div. 2, based on Technocup 2022 Elimination Round 2)(CF1589)题解
    Codeforces Round #754 (Div. 2)(CF1605)题解
    完美解读Linux中文件系统的目录结构
    C#中获取程序当前路径的集中方法
    30个优秀.net在线学习资源站点
    如何删除windows service(转帖)
  • 原文地址:https://www.cnblogs.com/cxd1008/p/6879793.html
Copyright © 2011-2022 走看看