gpt4 book ai didi

C# 外部类线程 (AutoResetEvent)

转载 作者:行者123 更新时间:2023-11-30 18:22:12 24 4
gpt4 key购买 nike

我在处理来自外部类的线程时遇到问题。我在线程方面还很陌生,所以很多事情对我来说仍然是个谜,所以请记住这一点。

我做了我的研究,发现了很多关于它的主题,包括:

它看起来很清楚,但仍然对我没有帮助。这是我的代码:

    public DownloadContent()
{
adres = @"...";

wb = new WebBrowser();
wb.Navigating += (object sender, WebBrowserNavigatingEventArgs e) => objWait.WaitOne();
wb.DocumentCompleted += (object sender, WebBrowserDocumentCompletedEventArgs e) => objWait.Set(); //Here is the problem
wb.DocumentCompleted += OnDocumentCompleted;
wb.Navigate(adres);

MessageBox.Show("after"); //should print after OnDocumentCompleted
}


private void OnDocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
//some logic
}

问题在于此 WebBrowser 类使用单独的线程来导航和完成文档。这没什么问题,但我不知道我的主线程应该如何与之通信。我试图让原始线程等待,但存在一个问题,即假设要再次启动它的函数 objWait.Set() 被当前卡住的主线程调用。我认为这是真正的问题。我尝试了很多奇怪的方法来让它工作:

  • 为 wb.Navigate(...) 创建另一个线程;它没有工作,因为它不能在单线程上工作;
  • 为 objWait.Set() 创建单独的线程;也没有用,不知道为什么;
  • 还有一些更奇怪的事情。

我知道这对某些人来说可能微不足道,但我已经坚持了几个小时,我真的不知道该怎么做。因此,我将不胜感激。

************************************************编辑*** *******************************************

谢谢大家的解答。我看到很多人注意到我最初的问题是什么,并给了我一些建议,我很感激,你让我的工作更轻松。话虽这么说,这个任务的本质是找出是否有任何好的方法来处理它。无论如何,谢谢你的所有建议和指导,一旦我完成这个小项目(当时的一件事),我会仔细研究它们。

我想我可以做类似的事情:

    public DownloadContent()
{
...
bool flag = true;
wb.DocumentCompleted += OnDocumentCompleted;
wb.DocumentCompleted += (object sender, WebBrowserDocumentCompletedEventArgs e) => flag = false;

wb.Navigate(adres);

while(flag);
MessageBox.Show("after"); //should print after OnDocumentCompleted
}

但我不知道这是否被认为是有效的或优雅的解决方案。如果对此有任何想法,我将不胜感激。提前谢谢你。

最佳答案

这样的事情怎么样:

public DownloadContent()
{

AutoResetEvent ase = new AutoResetEvent(false);

System.Threading.Tasks.Task.Factory.StartNew(()=>
{
adres = @"...";

wb = new WebBrowser();

wb.DocumentCompleted += (object sender, WebBrowserDocumentCompletedEventArgs e) => ase.Set(); //Here is the problem

wb.Navigate(adres);
});

ase.WaitOne();
MessageBox.Show("after"); //should print after OnDocumentCompleted
}

我们在不同的线程中开始下载,并阻塞当前线程直到文档完成。

关于C# 外部类线程 (AutoResetEvent),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34278927/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com