Cara mengakses metode Form.cs di kelas lain ketika ada multithreading c# [duplikat]

Kemungkinan Duplikat:
C# Downloader: haruskah saya menggunakan Threads, BackgroundWorker atau ThreadPool?
C#, bagaimana cara menjangkau sesuatu di thread saat ini yang dibuat di thread lain?

Jadi saya punya kode berikut

Pengunduh.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 + ".";
    }
}

Formulir1.cs / Formulir 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();
    }
}

Saya perlu membuat Form1.Instance.log = picUrl + " is downloaded to folder " + path + "."; berfungsi tanpa CheckForIllegalCrossThreadCalls disetel ke false karena menurut saya ini cara yang buruk dalam melakukan sesuatu.

PS:: Beberapa kodenya hilang tapi menurut saya informasi yang relevan ada di sana


person Crazywako    schedule 03.02.2013    source sumber


Jawaban (2)


Daripada menjadikan saveImages sebagai metode void dan memodifikasi formulir, saveImages harus mengembalikan nilai string yang dihitungnya dan mengizinkan formulir untuk memodifikasi dirinya sendiri:

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

Sekarang yang sebenarnya Anda cari adalah cara melakukan tugas yang sudah berjalan lama di thread latar belakang dan memperbarui UI dengan hasilnya. Kelas BackgroundWorker dirancang khusus untuk tujuan itu, dan lebih mudah digunakan dalam aplikasi winform daripada menangani thread secara langsung.

Anda hanya perlu membuat BackgroundWorker, mengatur pekerjaan yang perlu dilakukan di acara DoWork, lalu memperbarui UI di acara RunWorkerCompleted.

Dalam hal ini, DoWork hanya perlu memanggil saveImages dan kemudian mengatur Result ke nilai kembalian dan kemudian acara yang selesai dapat menambahkan Result ke kotak teks kaya. BackgroundWorker akan memastikan bahwa acara yang telah selesai akan dijalankan oleh thread UI.

person Servy    schedule 03.02.2013

Lihat dokumentasi tentang BackgroundWorker atau Control.Invoke. Ingat Google adalah teman Anda.

person Richard Schneider    schedule 03.02.2013