2010-11-14 58 views
13

Tôi hiện đang làm việc trên một dự án trong C#. Tôi có một phương thức gọi là updateProgress() có hai tham số int (count và totalRows).Chạy phương thức có tham số trong chuỗi trong C#

Nếu tôi đã gọi phương thức bằng cách nói updateProgress (count, totalRows), nó hoạt động tốt nhưng tôi muốn chạy phương thức này trong một chuỗi mới.

Làm cách nào để tôi thực hiện việc này, tôi đã xem trực tuyến và mọi thứ có vẻ quá phức tạp đối với những gì tôi muốn làm.

Nhờ sự giúp đỡ của bạn với

+2

Không cập nhật giao diện người dùng từ chuỗi công nhân. –

Trả lời

22

Something này như thế này:

new Thread(delegate() { 
    updateProgress(count, totalRows); 
}).Start(); 
+0

Cảm ơn mọi người đã giúp đỡ của bạn – Boardy

+0

Đã thử 'Chủ đề t = chủ đề mới (new ParameterizedThreadStart (phương pháp)); t.Start (tham số); 'nhưng điều đó không hiệu quả. Đoạn trích của bạn ở đây đã làm. Cảm ơn – Ortund

+0

@Ortund Liệu 'phương thức' có chữ ký' phương thức void (đối tượng) 'hay là tham số của một số kiểu khác? – cdhowie

0

Dưới đây là một ví dụ phức tạp hơn mà không đại biểu vô danh. Nhìn vào kết quả trong hàm đã hoàn thành.

using System; 
using System.Threading; 
using System.ComponentModel; 

class Program 
{ 
    static BackgroundWorker _bw; 

    static void Main() 
    { 
    _bw = new BackgroundWorker 
    { 
     WorkerReportsProgress = true, 
     WorkerSupportsCancellation = true 
    }; 
    _bw.DoWork += bw_DoWork; 
    _bw.ProgressChanged += bw_ProgressChanged; 
    _bw.RunWorkerCompleted += bw_RunWorkerCompleted; 

    _bw.RunWorkerAsync ("Hello to worker"); 

    Console.WriteLine ("Press Enter in the next 5 seconds to cancel"); 
    Console.ReadLine(); 
    if (_bw.IsBusy) _bw.CancelAsync(); 
    Console.ReadLine(); 
    } 

    static void bw_DoWork (object sender, DoWorkEventArgs e) 
    { 
    for (int i = 0; i <= 100; i += 20) 
    { 
     if (_bw.CancellationPending) { e.Cancel = true; return; } 
     _bw.ReportProgress (i); 
     Thread.Sleep (1000);  // Just for the demo... don't go sleeping 
    }       // for real in pooled threads! 

    e.Result = 123; // This gets passed to RunWorkerCompleted 
    } 

    static void bw_RunWorkerCompleted (object sender, 
            RunWorkerCompletedEventArgs e) 
    { 
    if (e.Cancelled) 
     Console.WriteLine ("You canceled!"); 
    else if (e.Error != null) 
     Console.WriteLine ("Worker exception: " + e.Error.ToString()); 
    else 
     Console.WriteLine ("Complete: " + e.Result);  // from DoWork 
    } 

    static void bw_ProgressChanged (object sender, 
            ProgressChangedEventArgs e) 
    { 
    Console.WriteLine ("Reached " + e.ProgressPercentage + "%"); 
    } 
} 
+0

Ý của bạn là "... không có đại biểu"? Tôi thấy một số chuyển đổi nhóm phương thức ngầm định trong mã của bạn. – Ani

+0

Nó sử dụng các hàm thay vì các đại biểu nội tuyến. Đôi khi họ dễ dàng hơn để làm việc và đọc đặc biệt cho người dùng luồng mới làm quen. – rboarman

+0

Sau đó, tôi nghĩ bạn nên làm rõ bằng cách nói "không có * đại biểu ẩn danh *". Nếu không, OP có thể hoàn toàn bỏ lỡ thực tế là một cá thể ủy nhiệm 'ProgressChangedEventHandler' đang được tạo ra, ví dụ. – Ani

5

Hãy nhận biết rằng luồng thực sự là một chủ đề phức tạp, vì vậy nếu bạn gặp khó khăn khi hiểu các API không đồng bộ có sẵn trong .NET Framework, tôi nghi ngờ bạn có nên bắt đầu sử dụng chuỗi không.

Dù sao, bạn có nhiều lựa chọn:

  • spin off a thread bằng cách riêng của bạn (như cdhowie chỉ ra), được chứ không phải nản lòng.

  • Sử dụng TPL (thư viện tác vụ song song) nếu bạn đang chạy trên .NET 4. Here là phần giới thiệu tốt. TaskFactory.StartNew(() => updateProgress(count, totalRows));

  • Sử dụng ThreadPool nếu bạn đang chạy trên phiên bản cũ hơn của .NET. ThreadPool.QueueUserWorkItem(s => updateProgress(count, totalRows));

Tất nhiên cũng có những cách khác, nhưng đây là những cách quan trọng nhất.

Best Regards,
Oliver Hanappi

0

thử sau

ThreadPool.QueueUserWorkItem((o) => { updateProgress(5, 6); }); 
1

Có nhiều cách khác nhau để chạy một phương pháp trong một chủ đề khác nhau, như Thread, BackgroundWorker, ThreadPool hoặc Task. Mà một trong những lựa chọn phụ thuộc vào những thứ khác nhau.

Từ tên của phương thức, có vẻ như phương pháp sẽ hiển thị một số tiến trình trong GUI của ứng dụng của bạn. Nếu trường hợp đó xảy ra, bạn phải chạy phương thức trên luồng GUI. Nếu bạn muốn gọi nó từ một chủ đề khác, bạn phải sử dụng Dispatcher.Invoke() trong WPF và Control.Invoke() trong WinForms.

1

Đã gần một năm và câu trả lời của tôi sẽ không thêm bất cứ điều gì "mới" vào những gì đã được nói trong các câu trả lời khác.

Nếu ai đó đang sử dụng .Net 4.0 hoặc cao hơn, các tùy chọn tốt nhất là sử dụng tác vụ và để khung công tác quyết định tốt nhất, bằng cách gọi TaskFactory.StartNew(...). Đối với các phiên bản cũ hơn, vẫn tốt hơn là sử dụng nhóm luồng bằng cách sử dụng ThreadPool.QueueUserWorkItem(...).

Bây giờ, nếu vẫn còn ai đó muốn sử dụng các chủ đề trong cách cơ bản (tạo thread mới) đối với một số lý do, thì đây

new Thread(delegate() { 
    updateProgress(count, totalRows); 
}).Start(); 

có thể được viết theo một cách sạch hơn chút, sử dụng biểu thức lambda, như thế này

new Thread(() => updateProgress(count, totalRows)).Start(); 
Các vấn đề liên quan