วิธีเข้าถึงวิธี Form.cs ในคลาสอื่นเมื่อมีมัลติเธรด c # [ซ้ำกัน]

รายการซ้ำที่เป็นไปได้:
ตัวดาวน์โหลด C#: ฉันควรใช้ Threads, 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:: รหัสบางส่วนหายไป แต่ฉันคิดว่ามีข้อมูลที่เกี่ยวข้องอยู่


person Crazywako    schedule 03.02.2013    source แหล่งที่มา


คำตอบ (2)


แทนที่จะให้ 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 ลงในกล่อง Rich Text ได้ BackgroundWorker จะตรวจสอบให้แน่ใจว่าเหตุการณ์ที่เสร็จสมบูรณ์จะถูกเรียกใช้โดยเธรด UI

person Servy    schedule 03.02.2013

ดูเอกสารประกอบเกี่ยวกับ BackgroundWorker หรือ Control.Inrigg จำไว้ว่า Google คือเพื่อนของคุณ

person Richard Schneider    schedule 03.02.2013