0

可能重复:
C# 下载器:我应该使用线程、BackgroundWorker 还是 ThreadPool?
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:: 部分代码缺失但我认为相关信息是有的

4

2 回答 2

1

而不是saveImages成为一个void方法并修改表单,saveImages应该返回它计算的字符串值并允许表单修改自己:

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

现在,您真正需要的是一种在后台线程中执行长时间运行的任务并使用结果更新 UI 的方法。该类BackgroundWorker是专门为此目的而设计的,并且在 winform 应用程序中使用比直接处理线程要容易得多。

你只需要创建一个BackgroundWorker,在事件中设置它需要做的工作,DoWork然后在事件中更新 UI RunWorkerCompleted

在这种情况下,DoWork只需要调用saveImages然后将 设置Result为返回值,然后完成的事件就可以添加Result到富文本框中。这BackgroundWorker将确保完成的事件将由 UI 线程运行。

于 2013-02-03T03:54:11.260 回答
1

请参阅有关 BackgroundWorker 或 Control.Invoke 的文档。记住谷歌是你的朋友。

于 2013-02-03T03:55:19.127 回答