Tôi ghét câu hỏi đầu tiên của tôi dường như đã được trả lời nhiều lần, nhưng tôi vẫn gặp khó khăn trong việc tìm cách gọi phương thức bằng cách sử dụng BackgroundWorker.Phương thức gọi từ BackgroundWorker
Tôi đang xử lý tệp văn bản rất lớn bằng cách sử dụng một loạt các lớp và phương pháp. Toàn bộ quá trình được khởi động sau khi người dùng chọn một mục dải công cụ. Tuần tự, nó đi như thế này:
- tài khoản chọn mục công cụ dải
- tài chọn một tập tin được xử lý thông qua một hộp thoại
- Hành động bắt đầu
Tôi nghĩ rằng tôi có thể quấn tất cả mọi thứ vào BackgroundWorker từ thời điểm người dùng bật hộp thoại ban đầu, nhưng những gì tôi muốn làm bây giờ chỉ là đặt phương thức mà tất cả việc nâng hạng nặng được thực hiện vào trường hợp riêng của BackGroundWorker. Tôi cũng sẽ thêm một ProgressBar, nhưng tôi nghĩ rằng tôi có thể xử lý điều đó nếu tôi chỉ có thể nhận được quá trình BackgroundWorker lăn.
Từ đỉnh (. Giả sử dụng cho các mục đích dụ Phần lớn bỏ qua cho ngắn gọn):
private void ToolStripMenuItem_Click(object sender, EventArgs e)
{
string fileName = openSingleFile.FileName;
processFile(fileName);
}
static public void processFile(string fileName)
{
// many vars/loops exist but not shown
foreach (data in bigData)
{
processItem(stringA, stringB); // <-- this method is where the expensive work is done
x++;
}
}
tôi đã tạo ra một thể hiện của BackgroundWorker ...:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
// Things go here
}
... và Tôi đã thử quá nhiều thứ để liệt kê, vì vậy tôi đã quay lại phần đầu của bài trình bày ở trên.
Nếu tôi hiểu BackgroundWorker, tôi sẽ cần phải làm như sau:
Thay processItem (stringA, stringB) trong đoạn mã trên với một cái gì đó như:
backgroundWorker1.RunWorkerAsync(processItem(stringA, stringB));
... và sau đó thực hiện một số loại cuộc gọi DoWork? ... và sau đó thực hiện một số loại cuộc gọi RunWorkerCompleted?
Không chắc chắn lý do tại sao bộ não của tôi bị đóng băng, nhưng tôi cảm thấy xấu hổ về lượng thời gian tôi đã dành cho việc này mà không có kết quả. Mọi sự trợ giúp sẽ rất được trân trọng. Nếu không có StackOverflow, tôi đã có thể là DOA từ lâu rồi.
FYI: Tôi đã tham chiếu các bài đăng SO, MSDN và DotNetPerls khác. Tôi chỉ thiếu một cái gì đó về mặt khái niệm, tôi cho là vậy.
Đừng quên kết hợp tất cả các sự kiện của bạn. bw.DoWork + = DoWorkEventHandler mới (bw_DoWork); bw.ProgressChanged + = tiến trình mớiChangedEventHandler (bw_ProgressChanged); bw.RunWorkerCompleted + = RunWorkerCompletedEventHandler mới (bw_RunWorkerCompleted); –
câu hỏi hay.helped cho tôi rất nhiều –