使用BackgroundWorker后,点击按钮时还是有假死状态

caicaihui 2013-03-01 01:15:50
点击后,开始一会儿界面会有假死状态,过完这个假死状态后面就流畅了,请问这个是什么问题。

BackgroundWorker bw = null;

public Form3()
{
InitializeComponent();

bw = new BackgroundWorker();
bw.WorkerSupportsCancellation = true;
bw.DoWork += new DoWorkEventHandler(bw_DoWork);
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
}

void bw_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 1; i < 100; i++)
{
Thread.Sleep(1);
if (bw.CancellationPending)
{
e.Cancel = true;
break;
}

this.Invoke((MethodInvoker)delegate
{
this.richTextBox1.Text += String.Format("第{0}次测试是否联网:{1}", i.ToString(), IsWWW("http://www.baidu.com?guid=" + Guid.NewGuid())) + Environment.NewLine;
});
Thread.Sleep(2000);
}
}

void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
this.richTextBox1.Text += "执行完毕";
}

private void button1_Click(object sender, EventArgs e)
{
this.button1.Enabled = false;
this.button2.Enabled = true;

bw.RunWorkerAsync();
}

private void button2_Click(object sender, EventArgs e)
{
this.button1.Enabled = true;
this.button2.Enabled = false;

bw.CancelAsync();
}

private void richTextBox1_TextChanged(object sender, EventArgs e)
{
RichTextBox textbox = (RichTextBox)sender;

textbox.SelectionStart = textbox.Text.Length;
textbox.ScrollToCaret();
}


private bool IsWWW(string url)
{
try
{
new WebClient().DownloadString(url);
return true;
}
catch (Exception ex)
{
return false;
}
}
...全文
263 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
rayyu1989 2013-03-01
  • 打赏
  • 举报
回复
是第一次建立webclient 这需要几秒不等,LZ可以移除webclient 就没有这个现象了 或者把webclient放在线程执行,返回结果后在invoke
caicaihui 2013-03-01
  • 打赏
  • 举报
回复
引用 4 楼 Shalves 的回复:
C# code ? 1234567891011121314151617181920212223242526272829 class Class1 { Class1() { WaitHandle wh = new AutoResetEvent(true); Thread th = n……
不明白的是bw_DoWork本身就是线程,为什么刚开始的时候会出现假死状态呢
Shalves 2013-03-01
  • 打赏
  • 举报
回复

    class Class1
    {
        Class1()
        {
            WaitHandle wh = new AutoResetEvent(true);
            Thread th = new Thread(new ParameterizedThreadStart(StartDoWork));
            th.Start(wh);
            wh.WaitOne();
            wh.Close();
            th.Abort();
        }

        void StartDoWork(object o)
        {
            var state = o as AutoResetEvent;
            bw_DoWork(this, null);
            Console.Write("执行完毕");
            state.Set();
        }

        void bw_DoWork(object sender, EventArgs e)
        {
            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine(i);
            }
        }
    }
caicaihui 2013-03-01
  • 打赏
  • 举报
回复
引用 2 楼 Shalves 的回复:
新建一条线程来执行 bw_DoWork
如何做呢?
Shalves 2013-03-01
  • 打赏
  • 举报
回复
新建一条线程来执行 bw_DoWork
hustgonia 2013-03-01
  • 打赏
  • 举报
回复
回复等加分。顺便ob楼主

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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