打印本文 打印本文 关闭窗口 关闭窗口
C#耗时操作防界面卡死 sleep不卡屏解决方法
作者:佚名  文章来源:本站原创  点击数2729  更新时间:2012/8/28 11:59:45  文章录入:mintao  责任编辑:mintao

C#耗时操作防界面卡死 sleep不卡屏解决方法 情况:单线程应用程序执行某项耗时操作(如读取大文件,大批量操作数据库,网络传输等)时,会导致方法阻塞,表现在界面上就是程序卡死,界面不响应;

解决:异步调用 如果您有看不懂下面方法的,您可以与站长闵涛www.mintao.net)联系。

1.方法之一

1.1首先定义一个委托,该委托指向的方法就是要执行耗时长的操作
    public delegate string  mydelegate(int num);

1.2定义异步完成时回调的函数:
private void callBackMethod(IAsyncResult result)
{
 /*由于已经在调用BeginInvoke传递的最后一个参数是回调委托
 所以可以从操作状态中获取*/
 mydelegate my = (mydelegate)result.AsyncState;
 //EndInvoke完成回调,并处理调用返回的结果
 string temp = my.EndInvoke(result);
  //处理返回的结果temp字符串
 MessageBox.Show("完成操作。" + temp);
}

1.3主线程执行:
 private void button1_Click(object sender, EventArgs e)
{
 //AsyncCallback本质是一种委托,类似Event
 AsyncCallback callBack = new AsyncCallback(callBackMethod);
 //委托指向耗时函数
 mydelegate dele = new mydelegate(longTimeDeal);
 //最后一个参数可传任何参数,方便在回调函数中使用
 IAsyncResult ar =dele.BeginInvoke(10000, callBack, dele);
}

1.4耗时操作函数:
private string longTimeDeal(int time)
{
 int second = time / 1000;
 Thread.Sleep(time);
 return "您的耗时操作花了约:" + second + "秒钟";
}

2.方法之二
2.1首先定义一个委托,该委托指向的方法就是要执行耗时长的操作
public delegate string  mydelegate(int num);

2.2主线程执行:
private void button1_Click(object sender, EventArgs e)
{
 //AsyncCallback本质是一种委托,类似Event
  AsyncCallback callBack = newAsyncCallback(callBackMethod);
 //委托指向耗时函数
 mydelegate dele = newmydelegate(longTimeDeal);
 // BeginInvoke返回结果可用于监视异步调用进度
 IAsyncResult ar = dele.BeginInvoke(10000, null, null);
 //异步调用完成后IsCompleted返回true
  while (ar.IsCompleted == false)
 {
        Application.DoEvents();
 }
 string result = dele.EndInvoke(ar);
 MessageBox.Show(result);
}

2.3耗时操作函数:
     private string longTimeDeal(int time)
        {
            int second = time / 1000;
            Thread.Sleep(time);
            return "您的耗时操作花了约:" + second + "秒钟";
        }

闵涛最近在研究C#时找到上面的这些代码,经过多次测试发现对砍实现了不卡屏的情况,不过CPU使用率50%左右,没有关系,开发的东西能用不卡就好。如果您不能解决。您可以向闵涛请教。

打印本文 打印本文 关闭窗口 关闭窗口