我有一个表格“DisplayImagesForm”,这在构造函数调用一个函数loadImages()
:新线程运行的UI线程
public ImageScraperForm(string query, RichTextBox textBox)
{
InitializeComponent();
this.query = query;
loadImages();
}
然后loadImages()
函数创建在最后一个新的线程:
{
...
Thread thread = new Thread(readNextImage);
thread.Start();
}
问题是,线程似乎不像UI线程那样以不同的线程运行。 readNextImage()
方法从服务器加载图像需要一些时间 - 加载图像时会阻塞整个窗体。这是不正常的,因为“线程”应该与UI线程分开运行。此外,readNextImage()
函数可以修改UI元素而不需要Invoke((MethodInvoker)delegate
- 不会引发异常。
从'Thread'返回交互结果真的很困难。有更简单的方法来做到这一点,但我们需要知道'readNextImage'的作用。它是否执行文件或网络I/O?你应该使用'await'。它是否执行繁重的计算或程序生成?使用['BackgroundWorker'](https://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker%28v=vs.110%29.aspx)可能会更好。 –
这是“Windows窗体”。 readNextImage执行网络I/O。没有繁重的计算,它只是将图像下载为流并显示在图片框中。 – Spejson
您是否尝试制作计时器,如果该计时器在线程终止之前关闭,则会向您发送诸如“未完成”之类的控制台消息,以便您知道线程正在工作,但工作成本超过我的成本你会想。当你的程序执行时,我曾考虑过使用perfmon应用程序来查看当你的线程正在做I/O工作时分配了多少资源! –