c# 怎么延时等待 一个耗时操作的返回

xiazaiziliao12364 2014-10-09 03:43:30

点击按钮时 调用一个耗时函数, 会导致界面假死

因为这个耗时函数是需要返回参数的,如果调用新进程去执行 ,怎么接收它的返回。


这种情况要怎么处理,谢谢
...全文
11689 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
lccleo 2016-04-27
  • 打赏
  • 举报
回复
backgroundworker 控件 自带的 超简单
software_artisan 2016-04-26
  • 打赏
  • 举报
回复
19楼的方法最简单,BackgroundWorker太古老了,也不好用
baobaodqh 2016-04-26
  • 打赏
  • 举报
回复
async/await(需要C# 5.0)啊!! 为个这装个5.0????? 还有什么方法解决
baobaodqh 2016-04-25
  • 打赏
  • 举报
回复
我要是碰到同样问题


 try
            {               
                this.Invoke((EventHandler)delegate
                {
                    toolStripStatusLabel1.Text = "开始读取....!";
                });
                ButtonStuet(1);             
                _trans.Delay(10);              
                byte[] revbuf = _trans.SendData(data);
                dt1 = Getdata("ParamSetRecord");                                         
                if (revbuf != null)
                {                   
                     ParamSet(dt1, revbuf);
                    toolStripStatusLabel1.Text = "读取完成";
                }
                else
                {                   
                    this.Invoke((EventHandler)delegate
                    {
                        toolStripStatusLabel1.Text = "数据读取不正确!请重新读取";
                    });
                }               
            }
            catch
            {               
                this.Invoke((EventHandler)delegate
                {
                    toolStripStatusLabel1.Text = "无数据........!";
                });              
            }

通讯时发送指令后延时处理数据!当多次操作时会出现软件死锁情况或无响应 有什么方法可以替换 System.Windows.Forms.Application.DoEvents(); sleep 延时中断操作 急等 并附代码 谢谢
baobaodqh 2016-04-25
  • 打赏
  • 举报
回复
 
 public void Delay(int milliSecond)
        {
            int start = Environment.TickCount;
            while (Math.Abs(Environment.TickCount - start) < milliSecond)
            {
                System.Windows.Forms.Application.DoEvents();
            }
        }
怎么解决啊
DongXiaorui 2014-10-12
  • 打赏
  • 举报
回复
引用 2 楼 china_ggd 的回复:
耗时函数应该另开个线程执行,可以写个委托来处理返回结果,用信号量或者静态变量也行。
同意
rayyu1989 2014-10-12
  • 打赏
  • 举报
回复
线程(池)+委托回调
smthgdin_020 2014-10-12
  • 打赏
  • 举报
回复
用回调函数来做一些异步操作。
我叫小菜菜 2014-10-12
  • 打赏
  • 举报
回复
肯定是异步操作,使用多线程的了。使用委托和事件都行,目的都是只有一个:在耗时操作结束前,当前线程应该处理自己的业务逻辑。耗时操作完毕后返回参数,通过某种方式通知当前线程,当前线程执行后续逻辑。

本人昨天做的一个很类似的小功能,使用BackgroundWorker实现的,感觉非常完美。

可以参考MSDN或者找我交流下,要源码。
  • 打赏
  • 举报
回复
用线程撒。、
kxyzjm62 2014-10-11
  • 打赏
  • 举报
回复
GoingNaive 2014-10-11
  • 打赏
  • 举报
回复
.NET Framework的异步编程模式主要有三种,基于任务的异步模式(TAP)是建议的方法,C# 5.0引入的async/await使得TAP模式的易用性极大的提高了。 关于.NET Framework的异步编程模式,请参看http://msdn.microsoft.com/zh-cn/library/jj152938(v=vs.110).aspx
暈哥 2014-10-11
  • 打赏
  • 举报
回复
一个简单的异步回调示例:

public void BeginTransfer(EnumFtpControl ctrl, Action endCallback)
		{
			....


			Task transferTask = new Task(transferAction, TaskCreationOptions.LongRunning);
				transferTask.ContinueWith(lastTask =>
					{
						if (TransferState != EnumTransferState.Aborting)
							endCallback();
						TransferState = EnumTransferState.Standby;
					});

				transferTask.Start();
				TransferState = EnumTransferState.Transferring;
		}

TransferPacker.Instance.BeginTransfer(BasicConfig.EnumFtpControl, () =>
				{
					logger.Info("FTP - 传输已经完成(SeqID:{0})", SeqID);
					TestStoped();
				});
GoingNaive 2014-10-11
  • 打赏
  • 举报
回复
最简单的方法:async/await(需要C# 5.0)。async/await的好处在于编写异步方法的逻辑顺序和同步方法的逻辑顺序是一致的,非常容易理解。

        // 将按钮的Click事件处理函数声明成async的
        private async void button1_Click(object sender, EventArgs e)
        {
            int result = await TimeConsumingMethodAsnyc(1);
            MessageBox.Show(result.ToString());
        }

        // 用async方法包装耗时函数
        private async Task<int> TimeConsumingMethodAsnyc(int arg)
        {
            return await Task.Run(() => TimeConsumingMethod(arg));
        }

        // 耗时函数
        private int TimeConsumingMethod(int arg)
        {
            Thread.Sleep(10000); // 模拟耗时过程
            return arg; // 有返回值
        }
csz_1987 2014-10-11
  • 打赏
  • 举报
回复
BackgroundWorker 这东西能满足你的需求吧?
生财 2014-10-11
  • 打赏
  • 举报
回复
可以用线程加事件通知的方法实现. 一般长时间操作都放到另一个线程中执行的.
Justin-Liu 2014-10-11
  • 打赏
  • 举报
回复
WinForm吧? 在循环里加
Application.DoEvents()
kkl_1195854501 2014-10-11
  • 打赏
  • 举报
回复
延迟时间的方法 private void Frm_Main_Load(object sender, EventArgs e) { Thread th = new Thread(//创建线程对象 () =>//使用Lambda表达式 { while (true)//无限循环 { Invoke(//在窗体线程中执行 (MethodInvoker)(() =>//使用Lambda表达式 { txt_Time.Text =//显示系统时间 DateTime.Now.ToString("F"); })); Thread.Sleep(1000);//线程挂起1000毫秒 } }); th.IsBackground = true;//设置线程为后台线程 th.Start();//开始执行线程 }
nongfuxu123 2014-10-10
  • 打赏
  • 举报
回复
引用
把接收到的返回值先放到一个全局变量里,然后在给线程结束注册个回调事件,线程结束了,主线程就调用这个事件,然后到全局变量里拿数据
这是不是说: 1)开辟一个线程,在线程中处理长延迟等待函数; 2)然后在此函数后面,结束此线程语句前,注册一个回调事件; 3)这样当“长延迟等待的函数”完成后,通过回调事件来通知UI线程,然后结束此线程。
加载更多回复(10)

110,566

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧