ฉันจะอัปเดตป้ายกำกับจากภายในเธรด BackgroundWorker ได้อย่างไร

เมื่อฉันใช้ WinForms ฉันจะทำสิ่งนี้ในวิธี bg_DoWork ของฉัน:

status.Invoke(new Action(() => { status.Content = e.ToString(); }));
status.Invoke(new Action(() => { status.Refresh(); }));

อย่างไรก็ตาม ในแอปพลิเคชัน WPF ของฉัน ฉันได้รับข้อผิดพลาดแจ้งว่าไม่มี Invoke สำหรับ Label

ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชม


person software is fun    schedule 22.05.2015    source แหล่งที่มา


คำตอบ (5)


สิ่งนี้จะช่วยคุณได้

ในการดำเนินการพร้อมกัน:

Application.Current.Dispatcher.Invoke(new Action(() => { status.Content = e.ToString(); }))

ในการดำเนินการแบบอะซิงโครนัส:

Application.Current.Dispatcher.BeginInvoke(new Action(() => { status.Content = e.ToString(); }))
person Gopichandar    schedule 22.05.2015

ใช้ความสามารถที่มีอยู่แล้วใน BackgroundWorker เมื่อคุณ "รายงานความคืบหน้า" ระบบจะส่งข้อมูลของคุณไปยังเหตุการณ์ ProgressChanged ซึ่งทำงานบนเธรด UI ไม่ต้องโทรInvoke()

private void bgWorker_DoWork(object sender, DoWorkEventArgs e)
{
    bgWorker.ReportProgress(0, "Some message to display.");
}

private void bgWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    status.Content = e.UserState.ToString();
}

ตรวจสอบให้แน่ใจว่าคุณได้ตั้งค่า bgWorker.WorkerReportsProgress = true เพื่อเปิดใช้งานการรายงานความคืบหน้า

person Grant Winney    schedule 22.05.2015
comment
นี้. เนื่องจากคุณไม่ต้องการอัปเดตการควบคุม UI ข้ามเธรดต่างๆ - person Mike Eason; 22.05.2015

หากคุณใช้ WPF ฉันขอแนะนำให้ดู DataBinding

"วิธี WPF" ในการเข้าถึงสิ่งนี้คือการผูกคุณสมบัติ Content ของป้ายกำกับเข้ากับคุณสมบัติบางอย่างของโมเดลของคุณ ด้วยวิธีนี้ การอัปเดตโมเดลจะอัปเดตป้ายกำกับโดยอัตโนมัติ และคุณไม่ต้องกังวลกับการจัดชุดเธรดด้วยตัวเอง

มีบทความมากมายเกี่ยวกับ WPF และ databinding ซึ่งน่าจะเป็นจุดเริ่มต้นที่ดีไม่แพ้กัน: http://www.wpf-tutorial.com/data-binding/hello-bound-world/

person paul    schedule 22.05.2015

คุณต้องใช้

Dispatcher.Invoke(new Action(() => { status.Content = e.ToString(); }))

แทนที่จะเป็น status.Invoke(...)

person Jens    schedule 22.05.2015

คุณควรคิดถึงการใช้พลังของ "Data Binding" ใน WPF

คุณควรอัปเดตออบเจ็กต์ในโมเดลมุมมองของคุณและเชื่อมโยงสิ่งนั้นเข้ากับการควบคุมส่วนต่อประสานผู้ใช้ของคุณ

ดูไฟ MVVM เรียบง่ายและใช้งานง่าย อย่าเขียนโค้ด WPF โดยไม่มีมัน

person AndrewJE    schedule 22.05.2015
comment
คุณไม่จำเป็นต้อง ต้องการ เฟรมเวิร์กที่หรูหราใดๆ เพื่อใช้รูปแบบการออกแบบ MVVM แม้ว่ามันจะทำให้บางสิ่งง่ายขึ้นเล็กน้อยในการจัดการ - person Mike Eason; 22.05.2015