zoukankan      html  css  js  c++  java
  • winform防止界面卡死的三种方法

    在编程过程中经常会遇到耗时操作,这个时候如果不采取一些必要的异步操作,就会导致界面的卡死,这里以winform为例子,介绍三种方法防止界面卡死,对这几个方法稍加修改同样适用于wpf,silverlight等程序

    首先给出一个函数模拟耗时操作

    1使用委托+QueueUserWorkItem

    delegate void ChangeInvoke(int num) ;
    private void ChangeNum(int num)
    {
    MessageBox.Show(num.ToString());
    }
    private void DoSomeThing(object state)
    {
    int i=0;
    for (int i = 0; i < int.MaxValue-1; i++)
    {
    i++;
    }
    ChangeInvoke change = new ChangeInvoke(ChangeNum);
    this.Invoke(change,new object[]{i});
    }
    以下是通过QueueUserWorkItem异步调用

    ThreadPool.QueueUserWorkItem(DoSomeThing);
    其实很简单,也就是一句代码的事。
    2使用Task

    首先还是模拟耗时操作

    private int TaskTest(int num,CancellationToken token) {
    // num = 0;
    for (int i = 0; i < int.MaxValue-10; i++)
    {
    token.ThrowIfCancellationRequested();
    num++;
    }
    return num;
    }
    这个耗时操作因为添加了CancellationToken,因而支持取消
    接着定义耗时操作完成之后的操作

    private void ShowResult(Task<Int32> t)
    {
    try
    {
    MessageBox.Show(t.Result.ToString());
    }
    catch(AggregateException ex)
    {
    MessageBox.Show("操作中断!");
    }
    }
    最后是利用进行异步操作
    Task<Int32> task = new Task<Int32>(n=>TaskTest(10,cancelSource.Token),0);
    task.Start();
    Task tsk = task.ContinueWith(t => ShowResult(t));
    如此程序将会在耗时操作结束是调用ShowResult函数
    以上两种方法使用到Task 和QueueUserWorkItem,因为之前已经有写过文章详细的介绍过,这里就不细说了,有兴趣的可以翻阅本人的前几篇文章,有做比较详细的介绍。

    3利用APM进行异步调用

    依然是耗时操作

    private int DoSomeThing(int num)
    {
    for (int i = 0; i < int.MaxValue - 10; i++)
    {
    num++;
    }
    return num;
    }
    下面是耗时操作结束后的操作
    private void APMDone(IAsyncResult result)
    {
    var sumDelegate = (Func<int, int>)result.AsyncState;
    try
    {
    int sumResult = sumDelegate.EndInvoke(result);
    MessageBox.Show(sumResult.ToString());
    }
    catch(Exception e)
    {
    MessageBox.Show(e.Message);
    }
    }
    最后是调用的方法
    Func<int, int> SumDelegate = TaskTest2;
    SumDelegate.BeginInvoke(0, APMDone, SumDelegate);

    ---------------------
    作者:小敏哥
    来源:CSDN
    原文:https://blog.csdn.net/handsomexiaominge/article/details/42653647
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    只打开一次浏览器,生成html测试报告<小紧张中......>
    hadoop学习第四天-Writable和WritableComparable序列化接口的使用&&MapReduce中传递javaBean的简单例子
    hadoop学习第三天-MapReduce介绍&&WordCount示例&&倒排索引示例
    hadoop学习第二天-了解HDFS的基本概念&&分布式集群的搭建&&HDFS基本命令的使用
    hadoop学习第一天-hadoop初步环境搭建&伪分布式计算配置(详细)
    大三了,写写博客
    方向问题
    第一天注册博客
    jquery跨域请求事例
    ECharts学习记录
  • 原文地址:https://www.cnblogs.com/asdyzh/p/9829697.html
Copyright © 2011-2022 走看看