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
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    大数据挖掘算法篇之K-Means实例
    断篇-金融大数据最佳实践总结篇
    网络爬虫之Windows环境Heritrix3.0配置指南
    开源中文分词框架分词效果对比smartcn与IKanalyzer
    Eclipse整合Tomcat开发Dynamic Web Project环境总结
    c#系统消息类封装
    Uploadify v3.2.1 参数说明
    js 或 且 非
    数据注解特性--NotMapped
    SQLServer2008/2005 生成数据字典语句
  • 原文地址:https://www.cnblogs.com/asdyzh/p/9829697.html
Copyright © 2011-2022 走看看