我有一個表格「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工作時分配了多少資源! –