|  |      1cxe2v      2014-04-28 13:02:36 +08:00  1 新开一个线程去执行耗时的操作 | 
|  |      2rebornix      2014-04-28 13:05:54 +08:00  1 比如你可以使用Task.Factory.StartNew() 当然为了perserve synchronization context,你可以用async/await. | 
|  |      3thinkif      2014-04-28 13:59:41 +08:00 其实你找的方法是对的。。。 | 
|  |      4dong3580      2014-04-28 14:10:04 +08:00 界面会卡住是因为你压根都没真正用到多线程,你只是用了多线程的那几个关键字. 开个线程,单线程肯定是不行的.你可以尝试使用: Thread newThread=new Thread(function()); newThread.Isbackground=true; newThread.Start(); | 
|      5jasontse      2014-04-28 14:10:48 +08:00 via iPad  1 using System.Threading; Thread thread = new Thread(new ThreadStart(ThreadFunction)); thread.Start(); public void ThreadFunction() { // 耗时操作 } | 
|  |      6tonghuashuai      2014-04-28 14:32:20 +08:00  1 多线程 | 
|  |      7cshcool OP @dong3580   我用你的方法试了,耗时操作如果用 thread.sleep() 来模拟,程序运行正常。 若将正式的耗时操作(从dll引入的函数)写入,新开的线程一旦执行到调用耗时操作的函数时,界面还是会先卡住10秒,随后的10秒虽然“耗时操作”仍未执行完,但界面上的时钟可以正常走,这问题出在哪? | 
|  |      8min      2014-04-28 17:00:31 +08:00 解释一下那个dll做了些什么 | 
|  |      9dong3580      2014-04-28 17:05:02 +08:00 @cshcool 不能使用sleep,sleep的意思在这里是阻塞进程,与多线程没有毛线的关系. thread.sleep() ,例如thread.sleep(2000) 就是将该进程阻塞2s, 新开线程: Thread t1=new Thread(这里面写上需要执行的方法); t1.Isbackground=true;//允许执行完方法之后自动回收内存 t1.Start();//开始执行 如果必要,可否给出你的程序精简代码, | 
|  |      10cshcool OP @dong3580    谢谢! private void DoWork() { .... 调用dll中的函数,耗时20秒左右(实际完成的是数据发送任务,发送成功的话就很快,失败就要等 待20秒左右才返回失败信息) .... } private void button1_Click(object sender, EventArgs e) { Thread Th = new Thread(new ThreadStart(StartMethod)); Th.IsBackground = true; Th.Start(); this.timer1.Enabled = true; } private void timer1_Tick(object sender, EventArgs e) { Thread.Sleep(1000); this.label1.Text = GetTime(); //显示当前时间 } | 
|  |      11dong3580      2014-04-28 17:34:49 +08:00 1.这个Thread.Sleep(1000);可以用timer设置时间间隔代替,你在这里写会造成界面卡顿1s; 2.多线程的话:这个this.label1.Text = GetTime(); 会造成界面卡顿,建议新开线程执行,不然你的多线程有什么用呢?并不是新建了一个线程就是多线程. 3.如果更改之后依然卡顿,最大的原因就是DoWork()方法的问题,如果这个方法里面都是用单线程完成一堆操作,你界面方法里面再怎么优化都没用. 20s,我的神,这dll能用么. |