0

重複の可能性:
C#ダウンローダー:Threads、BackgroundWorker、またはThreadPoolを使用する必要がありますか?
C#、他のスレッドで作成された現在のスレッドの何かに到達するにはどうすればよいですか?

だから私は次のコードを持っています

Downloader.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 + ".";せずに仕事をする必要があります。CheckForIllegalCrossThreadCallsfalse

PS ::一部のコードが欠落していますが、関連情報はそこにあると思います

4

2 に答える 2

1

メソッドでフォームを変更saveImagesするのではなく、計算する文字列値を返し、フォームがそれ自体を変更できるようにする必要があります。voidsaveImages

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設定するだけで、完了したイベントによってリッチテキストボックスにが追加されます。は、完了したイベントがUIスレッドによって実行されることを保証します。ResultResultBackgroundWorker

于 2013-02-03T03:54:11.260 に答える
1

BackgroundWorkerまたはControl.Invokeのドキュメントを参照してください。グーグルはあなたの友達であることを忘れないでください。

于 2013-02-03T03:55:19.127 に答える