2013-02-03 44 views
0

可能重複:
C# Downloader: should I use Threads, BackgroundWorker or ThreadPool?
C# , how reach something in current thread that created in other thread?如何訪問Form.cs方法在其他類當出現多線程C#

所以我下面的代碼

下載。 cs

class Downloader 
{ 
    private WebClient wc = new WebClient(); 
    public void saveImages(string picUrl, string path) 
    { 
       this.wc.DownloadFile(picUrl, path + p); 
       Form1.Instance.log = picUrl + " is downloaded to folder " + path + "."; 
    } 
} 

Form1.cs中/ Windows窗體

public partial class Form1 : Form 
{ 
    static Form1 instance; 
    public static Form1 Instance { get { return instance; } } 

    protected override void OnShown(EventArgs e) 
    { 
     base.OnShown(e); 
     instance = this; 
    } 

    protected override void OnClosed(EventArgs e) 
    { 
     base.OnClosed(e); 
     instance = null; 
    } 
    public string log 
    { 
     set { logbox.AppendText(value); } // Logbox is Rich Text Box 
    } 
    private void ThreadJob() 
    { 
     Downloader r = new Downloader(); 
     r.saveImages("http://c.org/car.jpg","c:/temp/"); 
    } 
    private void download_Click(object sender, EventArgs e) 
    { 
     ThreadStart job = new ThreadStart(ThreadJob); 
     Thread thread = new Thread(job); 
     CheckForIllegalCrossThreadCalls = false; 
     thread.Start(); 
    } 
} 

我需要得到Form1.Instance.log = picUrl + " is downloaded to folder " + path + ".";沒有CheckForIllegalCrossThreadCalls集工作,false,因爲我聽說它的壞的方式來做事。

PS ::某些代碼丟失,但我認爲相關信息是有

回答

1

與其讓saveImagesvoid方法和修改的形式,saveImages應該返回它計算的字符串值,並允許形成修改本身:

public string saveImages(string picUrl, string path) 
{ 
      this.wc.DownloadFile(picUrl, path + p); 
      return picUrl + " is downloaded to folder " + path + "."; 
} 

現在你真正尋找的是在後臺線程中執行長時間運行的任務和更新,結果用戶界面的一種方式。 BackgroundWorker類是專門爲此目的而設計的,比直接處理線程更容易在winform應用程序中使用。

您只需要創建一個BackgroundWorker,設置它需要在DoWork事件中執行的工作,然後更新RunWorkerCompleted事件中的UI。

在這種情況下,DoWork只需要調用saveImages,然後設置Result到返回值,然後完成事件可以添加Result富文本框。 BackgroundWorker將確保完成的事件將由UI線程運行。

1

請參閱有關BackgroundWorker或Control.Invoke的文檔。記住谷歌是你的朋友。

相關問題