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

  • 相关阅读:
    修改jupyter notebook主题、字体和启动路径
    numpy-matrix 方法速查
    Pycharm配置github
    数据库索引
    Matplotlib简单入门学习
    基础算法简单实现-python
    Learn Spring Framework(continue update...)
    "Hello World!" for Microsoft Windows
    "Hello World!" for the NetBeans IDE
    Lesson: The "Hello World!" Application
  • 原文地址:https://www.cnblogs.com/asdyzh/p/9829697.html
Copyright © 2011-2022 走看看