请问控件invoke之后无法响应事件怎么办?

风靡义磊 2015-07-12 09:26:18
首先我要做一个progressBar,为此开辟新线程:
            Thread loop = new Thread(new ThreadStart(ThreadProc));
loop.IsBackground = true;
loop.Start();

在新线程的循环中,如果用户按”停止“,就停下来。
      private void ThreadProc()
{

int n = 100000000;
int i;
double sum = 0;
progressBar1.BeginInvoke(new Action(() =>
{
for(i=1;i<n;i++)
{
sum += 1.0 / i;

if(i%1000000==0) progressBar1.Increment(1);

}
MessageBox.Show(sum.ToString());
}));
}

然而一旦invoke了,程序就不再响应用户事件了,请问这该怎么办?

另外还有一个问题,这样异步访问progressBar使得计算用时多了两倍,有什么更好的方法么?
...全文
309 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 7 楼 zhuankeshumo 的回复:
这样http://blog.csdn.net/conmajia/article/details/7831251
值得参考
於黾 2015-07-13
  • 打赏
  • 举报
回复
你先学会用backgroundworker吧 不明白线程是什么,那么就不要直接用线程
风靡义磊 2015-07-13
  • 打赏
  • 举报
回复
引用 10 楼 Z65443344 的回复:
你先学会用backgroundworker吧 不明白线程是什么,那么就不要直接用线程
可以看出,这个例子就是练习用的……正是因为不太懂,所以自己在研究,也百度了不少,可惜没能找到方法。
  • 打赏
  • 举报
回复
“死循环”程序思路是个死穴,如果你不能理解异步设计的想法,会被坑死。
江南小鱼 2015-07-13
  • 打赏
  • 举报
回复
如6#所说,Invoke代码要尽量短小,Invoke的目的是解决跨线程调用UI控件,不要把和UI控件无关的底码放在Invoke里面。
newtee 2015-07-13
  • 打赏
  • 举报
回复
这样http://blog.csdn.net/conmajia/article/details/7831251
Forty2 2015-07-13
  • 打赏
  • 举报
回复
把耗时计算放在Invoke外面就可以了。 Invoke要尽量短,因为它在UI线程上运行,会让UI停止相应。

private void ThreadProc()
{
    int n = 100000000;
    int i;
    double sum = 0;

    for (i = 1; i < n; i++)
    {
        sum += 1.0 / i;
        if (i % 1000000 == 0)
        {
            if (value == 1) break;
            progressBar1.BeginInvoke((Action)delegate
            {
                progressBar1.Increment(1);
            });
        }
    }
    MessageBox.Show(sum.ToString());
}

volatile int value = 0;
private void stopButton_Click(object sender, EventArgs e)
{
    value = 1;
}
1987andy 2015-07-13
  • 打赏
  • 举报
回复
BeginInvoke 要注意上下文
江南小鱼 2015-07-12
  • 打赏
  • 举报
回复
控件的BeginInvoke方法使用的是UI线程,匿名委托代码执行完成之前,UI线程处于阻塞状态,导致按钮事件不响应。 改成this.Invoke方式跨线程访问窗体控件
风靡义磊 2015-07-12
  • 打赏
  • 举报
回复
引用 3 楼 lovelj2012 的回复:
1、你的计算,指的是这堆代码
 for(i=1;i<n;i++)
                        {
                            sum += 1.0 / i;
                        }
                        MessageBox.Show(sum.ToString());
么?你停止按钮单击事件的代码贴出来看看。 2、完成一次计算,指的是从开始执行到MessageBox.Show出值的时间间隔么?
我没贴全,这段代码的for里面还有一句if(value==1) break; value就是初始值为0的全局变量,单击停止就是value=1; 问题不是出在这里,就是invoke以后就所有按钮都不触发点击事件了,视觉上就看得出来。 用时就是for循环耗时啊
江南小鱼 2015-07-12
  • 打赏
  • 举报
回复
1、你的计算,指的是这堆代码
 for(i=1;i<n;i++)
                        {
                            sum += 1.0 / i;
                        }
                        MessageBox.Show(sum.ToString());
么?你停止按钮单击事件的代码贴出来看看。 2、完成一次计算,指的是从开始执行到MessageBox.Show出值的时间间隔么?
风靡义磊 2015-07-12
  • 打赏
  • 举报
回复
引用 1 楼 lovelj2012 的回复:
然而一旦invoke了,程序就不再响应用户事件了,请问这该怎么办?
神马意思?
这样异步访问progressBar使得计算用时多了两倍
你指的是进度条达到100%的耗时?
1.本来假如不Invoke,就是不管progressBar,我可以在计算过程中单击停止按钮,停止计算。 但是加了Invoke之后,点按钮就没反应了。 2.就是完成一次计算的耗时。
江南小鱼 2015-07-12
  • 打赏
  • 举报
回复
然而一旦invoke了,程序就不再响应用户事件了,请问这该怎么办?
神马意思?
这样异步访问progressBar使得计算用时多了两倍
你指的是进度条达到100%的耗时?

111,092

社区成员

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

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

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