Tôi hiện đang viết chương trình đầu tiên của mình trên C# và tôi cực kỳ mới với ngôn ngữ (được sử dụng để chỉ làm việc với C cho đến nay). Tôi đã thực hiện rất nhiều nghiên cứu, nhưng tất cả các câu trả lời đều quá chung chung và tôi không thể làm việc đó được.Cách cập nhật giao diện người dùng từ một chuỗi khác đang chạy trong một lớp khác
Vì vậy, đây là vấn đề của tôi (rất phổ biến): Tôi có một ứng dụng WPF có đầu vào từ một vài hộp văn bản được người dùng điền và sau đó sử dụng để thực hiện nhiều phép tính với chúng. Họ sẽ mất khoảng 2-3 phút, vì vậy tôi muốn cập nhật một thanh tiến trình và một textblock cho tôi biết tình trạng hiện tại là gì. Ngoài ra tôi cần phải lưu trữ các đầu vào giao diện người dùng từ người dùng và đưa chúng vào luồng, vì vậy tôi có một lớp thứ ba, mà tôi sử dụng để tạo một đối tượng và muốn chuyển đối tượng này đến chủ đề nền. Rõ ràng là tôi sẽ chạy các phép tính trong một chuỗi khác, vì vậy giao diện người dùng không bị đóng băng, nhưng tôi không biết cách cập nhật giao diện người dùng vì tất cả các phương pháp tính toán là một phần của một lớp khác. Sau nhiều nghiên cứu, tôi nghĩ rằng phương pháp tốt nhất để sử dụng sẽ là sử dụng điều phối viên và TPL chứ không phải là người làm việc nền tảng, nhưng thành thật mà nói tôi không chắc họ làm việc như thế nào và sau khoảng 20 giờ dùng thử và lỗi với các câu trả lời khác, tôi quyết định tự đặt câu hỏi.
Dưới đây là một cấu trúc rất đơn giản của chương trình của tôi:
public partial class MainWindow : Window
{
public MainWindow()
{
Initialize Component();
}
private void startCalc(object sender, RoutedEventArgs e)
{
inputValues input = new inputValues();
calcClass calculations = new calcClass();
try
{
input.pota = Convert.ToDouble(aVar.Text);
input.potb = Convert.ToDouble(bVar.Text);
input.potc = Convert.ToDouble(cVar.Text);
input.potd = Convert.ToDouble(dVar.Text);
input.potf = Convert.ToDouble(fVar.Text);
input.potA = Convert.ToDouble(AVar.Text);
input.potB = Convert.ToDouble(BVar.Text);
input.initStart = Convert.ToDouble(initStart.Text);
input.initEnd = Convert.ToDouble(initEnd.Text);
input.inita = Convert.ToDouble(inita.Text);
input.initb = Convert.ToDouble(initb.Text);
input.initc = Convert.ToDouble(initb.Text);
}
catch
{
MessageBox.Show("Some input values are not of the expected Type.", "Wrong Input", MessageBoxButton.OK, MessageBoxImage.Error);
}
Thread calcthread = new Thread(new ParameterizedThreadStart(calculations.testMethod);
calcthread.Start(input);
}
public class inputValues
{
public double pota, potb, potc, potd, potf, potA, potB;
public double initStart, initEnd, inita, initb, initc;
}
public class calcClass
{
public void testmethod(inputValues input)
{
Thread.CurrentThread.Priority = ThreadPriority.Lowest;
int i;
//the input object will be used somehow, but that doesn't matter for my problem
for (i = 0; i < 1000; i++)
{
Thread.Sleep(10);
}
}
}
Tôi sẽ rất biết ơn nếu ai đó có một lời giải thích đơn giản như thế nào để cập nhật giao diện người dùng từ bên trong TestMethod. Kể từ khi tôi mới đến C# và lập trình hướng đối tượng, câu trả lời quá phức tạp tôi rất có thể sẽ không hiểu, tôi sẽ làm tốt nhất của tôi mặc dù.
Ngoài ra nếu ai đó có ý tưởng tốt hơn nói chung (có thể sử dụng nhân viên làm nền hoặc bất kỳ điều gì khác), tôi mở để xem.
Đây là câu hỏi cũ và được trả lời, nhưng đủ phổ biến để tôi chia sẻ điều này cho bất kỳ ai muốn triển khai 'Trình báo cáo tiến độ' rất đơn giản giữa các chủ đề. Sử dụng lớp Progress. Việc thực hiện được chi tiết trong một bài viết hay của Stephan Cleary tại đây: http://blog.stephencleary.com/2012/02/reporting-progress-from-async-tasks.html. –
SeanOB