线程的事件未执行..

liu_lxx 2014-05-20 03:03:17

WebBrowser w1;
private void button1_Click(object sender, EventArgs e)
{
Thread t = new Thread(p =>
{
w1 = new WebBrowser();
w1.ObjectForScripting = this;
w1.Navigate(System.Environment.CurrentDirectory + @"\test.html");
w1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(GetBitmap);
});
t.TrySetApartmentState(ApartmentState.STA);
t.Start();
}
private void GetBitmap(object sender,WebBrowserDocumentCompletedEventArgs e)
{
HtmlElement element = w1.Document.Body;
int w = element.ScrollRectangle.Width + element.OffsetRectangle.Width;
int h = element.ScrollRectangle.Height + element.OffsetRectangle.Height;

w1.Width = w;
w1.Height = h;
using (Bitmap bmp = new Bitmap(w, h))
{
w1.DrawToBitmap(bmp, element.ClientRectangle);
string fileName = "d:\\" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".bmp";
bmp.Save(fileName);
}
}


问题:运行时没进GetBitmap方法,刚开始接触线程,求详细指点..
PS:不用线程,是能进GetBitmap方法的
...全文
147 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
liu_lxx 2014-05-20
  • 打赏
  • 举报
回复
引用 6 楼 jan307 的回复:
WebBrowser w1;
AutoResetEvent autoResetEvent = new AutoResetEvent(false);
private void button1_Click(object sender, EventArgs e)
        {
            Thread t = new Thread(p =>
            {
                w1 = new WebBrowser();
                w1.ObjectForScripting = this;
                w1.Navigate(System.Environment.CurrentDirectory + @"\test.html");
                w1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(GetBitmap);
                while (w1 .ReadyState != WebBrowserReadyState.Complete)
                {
                       Application.DoEvents();
                }
            });
            t.TrySetApartmentState(ApartmentState.STA);
            t.Start();
            t.Join();
        }
private void GetBitmap(object sender,WebBrowserDocumentCompletedEventArgs e)
        {
            HtmlElement element = w1.Document.Body;
            int w = element.ScrollRectangle.Width + element.OffsetRectangle.Width;
            int h = element.ScrollRectangle.Height + element.OffsetRectangle.Height;
  
            w1.Width = w;
            w1.Height = h;
            using (Bitmap bmp = new Bitmap(w, h))
            {
                w1.DrawToBitmap(bmp, element.ClientRectangle);
                string fileName = "d:\\" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".bmp";
                bmp.Save(fileName);
            }
               //即通知正在等待的线程有事件发生  
                autoResetEvent.Set();  
        }
行了 谢谢,没加事件的时候还试过这种写法 加了事件之后反而忘了 不胜感激..
jan307 2014-05-20
  • 打赏
  • 举报
回复
WebBrowser w1;
AutoResetEvent autoResetEvent = new AutoResetEvent(false);
private void button1_Click(object sender, EventArgs e)
        {
            Thread t = new Thread(p =>
            {
                w1 = new WebBrowser();
                w1.ObjectForScripting = this;
                w1.Navigate(System.Environment.CurrentDirectory + @"\test.html");
                w1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(GetBitmap);
                while (w1 .ReadyState != WebBrowserReadyState.Complete)
                {
                       Application.DoEvents();
                }
            });
            t.TrySetApartmentState(ApartmentState.STA);
            t.Start();
            t.Join();
        }
private void GetBitmap(object sender,WebBrowserDocumentCompletedEventArgs e)
        {
            HtmlElement element = w1.Document.Body;
            int w = element.ScrollRectangle.Width + element.OffsetRectangle.Width;
            int h = element.ScrollRectangle.Height + element.OffsetRectangle.Height;
  
            w1.Width = w;
            w1.Height = h;
            using (Bitmap bmp = new Bitmap(w, h))
            {
                w1.DrawToBitmap(bmp, element.ClientRectangle);
                string fileName = "d:\\" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".bmp";
                bmp.Save(fileName);
            }
               //即通知正在等待的线程有事件发生  
                autoResetEvent.Set();  
        }
liu_lxx 2014-05-20
  • 打赏
  • 举报
回复
引用 1 楼 pengyi_205 的回复:
异步事件完成,应该是异步还没有执行完,线程就结束了, 所以你可以在 w1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(GetBitmap); 这句后面,设置一个信号量,让线程不要结束,然后在 private void GetBitmap(object sender,WebBrowserDocumentCompletedEventArgs e) 方法里,重置这个信号量。

WebBrowser w1;
AutoResetEvent autoResetEvent = new AutoResetEvent(false);
private void button1_Click(object sender, EventArgs e)
        {
            Thread t = new Thread(p =>
            {
                w1 = new WebBrowser();
                w1.ObjectForScripting = this;
                w1.Navigate(System.Environment.CurrentDirectory + @"\test.html");
                w1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(GetBitmap);
                autoResetEvent .WaitOne();
            });
            t.TrySetApartmentState(ApartmentState.STA);
            t.Start();
        }
private void GetBitmap(object sender,WebBrowserDocumentCompletedEventArgs e)
        {
            HtmlElement element = w1.Document.Body;
            int w = element.ScrollRectangle.Width + element.OffsetRectangle.Width;
            int h = element.ScrollRectangle.Height + element.OffsetRectangle.Height;
 
            w1.Width = w;
            w1.Height = h;
            using (Bitmap bmp = new Bitmap(w, h))
            {
                w1.DrawToBitmap(bmp, element.ClientRectangle);
                string fileName = "d:\\" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".bmp";
                bmp.Save(fileName);
            }
               //即通知正在等待的线程有事件发生  
                autoResetEvent.Set();  
        }
这样改试试。
试过了,还是没有进GetBitmap方法额..
liu_lxx 2014-05-20
  • 打赏
  • 举报
回复
引用 2 楼 pengyi_205 的回复:
话说,你为什以要另起一个线程呢?


如果不另起线程会报这样一个错:

这是一个测试的例子,原方法WebBrowser w1 = new WebBrowser();放在方法中的,不另起线程运行就报错
yzf86211861 2014-05-20
  • 打赏
  • 举报
回复
.NET也写了 5年了 多线程 真的 很少用 学习 围观大神
夺命胖子 2014-05-20
  • 打赏
  • 举报
回复
话说,你为什以要另起一个线程呢?
夺命胖子 2014-05-20
  • 打赏
  • 举报
回复
异步事件完成,应该是异步还没有执行完,线程就结束了, 所以你可以在 w1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(GetBitmap); 这句后面,设置一个信号量,让线程不要结束,然后在 private void GetBitmap(object sender,WebBrowserDocumentCompletedEventArgs e) 方法里,重置这个信号量。

WebBrowser w1;
AutoResetEvent autoResetEvent = new AutoResetEvent(false);
private void button1_Click(object sender, EventArgs e)
        {
            Thread t = new Thread(p =>
            {
                w1 = new WebBrowser();
                w1.ObjectForScripting = this;
                w1.Navigate(System.Environment.CurrentDirectory + @"\test.html");
                w1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(GetBitmap);
                autoResetEvent .WaitOne();
            });
            t.TrySetApartmentState(ApartmentState.STA);
            t.Start();
        }
private void GetBitmap(object sender,WebBrowserDocumentCompletedEventArgs e)
        {
            HtmlElement element = w1.Document.Body;
            int w = element.ScrollRectangle.Width + element.OffsetRectangle.Width;
            int h = element.ScrollRectangle.Height + element.OffsetRectangle.Height;
 
            w1.Width = w;
            w1.Height = h;
            using (Bitmap bmp = new Bitmap(w, h))
            {
                w1.DrawToBitmap(bmp, element.ClientRectangle);
                string fileName = "d:\\" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".bmp";
                bmp.Save(fileName);
            }
               //即通知正在等待的线程有事件发生  
                autoResetEvent.Set();  
        }
这样改试试。

62,046

社区成员

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

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

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

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