2010-05-11 36 views
5

Tôi muốn chuyển một hàm nhận tham số cho Trình tạo chuỗi ThreadStart trong C#. Nhưng, có vẻ như điều này là không thể, khi tôi nhận được một lỗi cú pháp nó tôi cố gắng làm một cái gì đó như thế nàychuyển tham số cho một chủ đề

Thread t1 = new Thread(new ThreadStart(func1(obj1)); 

nơi obj1 là một đối tượng kiểu List<string> (nói).

Nếu tôi muốn một chủ đề thực thi hàm này trong đối tượng dưới dạng tham số và tôi dự định tạo 2 chuỗi như vậy cùng với các giá trị tham số khác nhau thì phương pháp nào tốt nhất để đạt được điều này?

+1

Bạn đang sử dụng phiên bản .NET nào? –

+0

Thật tuyệt vời! Tôi đã làm điều này trước khi tạo ra một lớp để chứa dữ liệu mà thread sẽ sử dụng, nhưng tôi không biết có quá nhiều cách khác nhau để làm da con vật này! –

Trả lời

7

Bạn cần ParametrizedThreadStart để chuyển tham số cho chuỗi.

Thread t1 = new Thread(new ParametrizedThreadStart(func1); 
t1.Start(obj1); 
+0

Cảm ơn rất nhiều .. phương pháp này hoạt động ..tuy nhiên, định nghĩa cho func1 trong trường hợp này sẽ phải là void func1 (trạng thái đối tượng) và không thể là void func1 (Danh sách obj1) tại sao lại như vậy? – assassin

+0

Đó là cách loại đại biểu 'ParametrizedThreadStart' được định nghĩa. Bạn sẽ phải đưa 'object' trở lại' List 'bên trong' func1'. – Thomas

13

Nếu bạn đang sử dụng .NET 3.5 hoặc cao hơn, một lựa chọn là sử dụng một lambda cho việc này:

var myThread = new System.Threading.Thread(() => func1(obj1)); 
+0

Cảm ơn rất nhiều !!! – assassin

3

Hãy thử điều này:

var bar = 0.0; 
Thread t = new Thread(() => 
    { 
     Foo(bar); 
    }); 
t.IsBackground = true; 
t.Start(); 

Hoặc trong trường hợp của bạn:

Object obj1 = new Object(); 
Thread t = new Thread(() => 
    { 
     func1(obj1); 
    }); 
t.IsBackground = true; 
t.Start(); 
7

Bạn có thể bắt đầu một chủ đề mới như sau:

Thread thread = new Thread(delegate() { 
    // Code here. 
}); 
thread.Start(); 

Bên trong anonymous method bạn có quyền truy cập vào các biến nằm trong phạm vi khi đại biểu được tạo.

3

Sửa Assassin gặp rắc rối khi mã này để làm việc, vì vậy tôi đã bao gồm một ứng dụng ví dụ giao diện điều khiển hoàn chỉnh vào cuối của bài viết này.

 


{ // some code 
    Thread t1 = new Thread(MyThreadStart); 
    t1.Start(theList); 
} 

void MyThreadStart(object state) 
{ 
    List<string> theList = (List<string>)state; 
    //.. 
} 

 

Đây là chỉnh sửa của tôi: Dưới đây là một ứng dụng giao diện điều khiển hoàn chỉnh - kỹ thuật này thực sự làm việc:

 

using System; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      System.Threading.Thread t = new System.Threading.Thread(MyThreadStart); 
      t.Start("Hello"); 
      System.Console.ReadLine(); 
     } 


     static void MyThreadStart(object state) 
     { 
      System.Console.WriteLine((string)state); 
     } 
    } 
} 

 
+0

Điều này không hoạt động .. tôi đã thử nó ... phương pháp ParametrizedThreadStart được đề xuất bởi Thomas hoạt động. – assassin

+0

@assassin Tôi đảm bảo với bạn, nó hoạt động. Tôi đã chỉnh sửa mục nhập của tôi để bao gồm một ứng dụng giao diện điều khiển mà bạn có thể dán trực tiếp vào Visual Studio và chạy. Cú pháp này đã hoạt động kể từ .Net 2.0 và nếu bạn thay thế "Thread mới (MyThreadStart)" bằng "new Thread (new delegate) – JMarsch

3

Đây có phải là tác dụng bạn đang tìm kiếm?

 static void Main(string[] args) 
    { 
     var list = new List<string>(){ 
      "a","b","c" 
     }; 

     Thread t1 = new Thread(new ParameterizedThreadStart(DoWork)); 

     t1.Start(list); 

     Console.ReadLine(); 

    } 

    public static void DoWork(object stuff) 
    { 
     foreach (var item in stuff as List<string>) 
     { 
      Console.WriteLine(item); 
     } 
    } 
1
static void func1(object parameter) 
{ 
    // Do stuff here. 
} 

static void Main(string[] args) 
{ 
    List<string> obj1 = new List<string>(); 
    Thread t1 = new Thread(func1); 
    t1.Start(obj1); 
} 

Đó là sử dụng một đại biểu mới trong Net 2.0 gọi ParameterizedThreadStart. Bạn có thể đọc về nó here.

0

Bạn có cần sử dụng đối tượng Thread không? Hay bạn chỉ đang tìm kiếm xử lý đa luồng để xảy ra? Một cách tiếp cận "hiện đại" hơn sẽ được sử dụng một đại biểu không đồng bộ như vậy:

private delegate void FuncDelegate(object obj1); 
. 
. 
. 
FuncDelegate func = func1; 
IAsyncResult result = func.BeginInvoke(obj1, Completed, func); 

// do other stuff 
. 
. 
. 

private void Completed(IAsyncResult result) 
{ 
    ((FuncDelegate)result.AsyncState).EndInvoke(result); 

    // do other cleanup 
} 

Một thậm chí phương pháp hơn "hiện đại" sẽ được sử dụng Tasks trong .NET 4 TPL.

Các vấn đề liên quan