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

  • 相关阅读:
    Daily Build[called heart beat]
    JS判断浏览器类型与版本
    Dependency Injection in ASP.NET MVC
    Splash Screen(短时间弹出框,信息显示一次)
    Mock Framework
    sites for debugging script
    Types in Javascript(jQuery)
    推荐10个超棒的jQuery工具 提示插件
    WebClient 下载文件
    sqlserver导入Excel数据 总是报错:错误 0xc020901c: 数据流任务 1: 输出“Excel 源输出”(55) 上的 输出列“T2”(64) 出错。返回的列状态是:“文本被截断,或者一个或多个字符在目标代码页中没有匹配项
  • 原文地址:https://www.cnblogs.com/asdyzh/p/9829697.html
Copyright © 2011-2022 走看看