2009-05-01 41 views
28

Các phương pháp dưới đây là những gì tôi muốn được thực hiện trong chủ đề đó:Làm cách nào để tạo một chuỗi?

public void Startup(int port,string path) 
{ 
    Run(path); 
    CRCCheck2(); 
    CRCCheck1(); 
    InitializeCodeCave((ushort)port); 
} 

tôi đã cố gắng những gì tôi có thể tìm googling, nhưng không làm việc

public void Test(int port,string path) 
{ 
    Thread t = new Thread(Startup(port,path)); 
} 

public void TestA(int port,string path) 
{ 
    Thread t = new Thread(Startup); 
    t.Start (port,path); 
} 

Cả hai không biên dịch, làm thế nào để làm cái đó?

+1

không hoạt động hoặc không biên dịch? – Aziz

+0

Bạn nên chỉ định ngôn ngữ được sử dụng để tôi (chúng tôi) không phải đoán. Cũng nói rằng, những gì không hoạt động sẽ là tuyệt vời. – tuergeist

+1

Kiểm tra các thẻ câu hỏi - C# Nó không biên dịch. –

Trả lời

51

Các cách sau hoạt động.

// The old way of using ParameterizedThreadStart. This requires a 
// method which takes ONE object as the parameter so you need to 
// encapsulate the parameters inside one object. 
Thread t = new Thread(new ParameterizedThreadStart(StartupA)); 
t.Start(new MyThreadParams(path, port)); 

// You can also use an anonymous delegate to do this. 
Thread t2 = new Thread(delegate() 
{ 
    StartupB(port, path); 
}); 
t2.Start(); 

// Or lambda expressions if you are using C# 3.0 
Thread t3 = new Thread(() => StartupB(port, path)); 
t3.Start(); 

Phương pháp khởi động có chữ ký sau cho các ví dụ này.

public void StartupA(object parameters); 

public void StartupB(int port, string path); 
+1

Tôi gặp lỗi khi sử dụng "cách cũ", nhưng biểu thức lamba hoạt động hoàn hảo. :) –

+1

Làm rõ các chữ ký của phương thức Khởi động bắt buộc. –

+0

Đẹp - Tôi vừa mới đăng câu trả lời dưới đây bằng cách sử dụng cách "cũ", nhưng không nhận ra bạn có thể sử dụng các biểu thức lambda để tạo một điểm vào luồng sạch hơn. –

7

Phương pháp bạn muốn chạy phải là ThreadStart Delegate. Vui lòng tham khảo Thread documentation trên MSDN. Lưu ý rằng bạn có thể sắp xếp bắt đầu hai tham số của mình bằng cách đóng. Một cái gì đó như:

var t = new Thread(() => Startup(port, path)); 

Lưu ý rằng bạn có thể muốn truy cập lại khả năng truy cập phương pháp của mình. Nếu tôi thấy một lớp học bắt đầu một chủ đề theo phương pháp riêng của mình theo cách này, tôi sẽ hơi ngạc nhiên.

+0

Tôi đã thử điều này, nó không hoạt động. ThreadStart t = new ThreadStart (Khởi động); << Không có quá tải cho 'Khởi động' phù hợp với đại biểu 'System.Threading.ThreadStart –

+0

Khởi động có hai tham số. Nếu bạn kiểm tra các tài liệu tôi đã liên kết, ThreadStart sẽ không có tham số. Chúng ta có thể gian lận với một đóng để làm cho nó trông giống như hai (trong 3.5), hoặc chúng ta có thể sử dụng ParameterizedThreadStart và gộp hai tham số vào một đối tượng (trước 3.5). –

2
public class ThreadParameter 
     { 
      public int Port { get; set; } 
      public string Path { get; set; } 
     } 


Thread t = new Thread(new ParameterizedThreadStart(Startup)); 
t.Start(new ThreadParameter() { Port = port, Path = path}); 

Tạo đối tượng với các đối tượng cổng và đường dẫn và chuyển nó tới phương pháp khởi động.

+0

Chỉ khi tôi viết dòng đầu tiên của bạn, tôi nhận được "Không có quá tải cho 'Startup' phù hợp với đại biểu 'System.Threading.ParameterizedThreadStart" –

+0

Khởi động cần phải là "void Startup (tham số đối tượng)". Bạn không thể sử dụng "void Startup (tham số ThreadParameter)" khi bạn không thể vượt qua một đối tượng cho một. Bạn có thể truyền tham số đối tượng vào ThreadParameter bên trong Startup. –

+0

bạn phải thay đổi chữ ký của phương thức Khởi động để chấp nhận lớp ThreadParameter ..... (lớp bạn đã tạo với 2 tham số). – CSharpAtl

2

Ví dụ của bạn không thành công vì phương thức Thread có một hoặc 0 đối số. Để tạo một chủ đề không có đối số truyền, mã của bạn trông như thế này:

void Start() 
{ 
    // do stuff 
} 

void Test() 
{ 
    new Thread(new ThreadStart(Start)).Start(); 
} 

Nếu bạn muốn để truyền dữ liệu đến các chủ đề, bạn cần để đóng gói dữ liệu của bạn vào một đối tượng duy nhất, cho dù đó là một lớp tùy chỉnh của bạn thiết kế riêng, hoặc một đối tượng từ điển hay cái gì đó khác. Sau đó bạn cần phải sử dụng ParameterizedThreadStart đại biểu, như vậy:

void Start(object data) 
{ 
    MyClass myData = (MyClass)myData; 
    // do stuff 
} 

void Test(MyClass data) 
{ 
    new Thread(new ParameterizedThreadStart(Start)).Start(data); 
} 
7

Tôi thích Factory công tác từ System.Threading.Tasks. Bạn có thể làm một cái gì đó như thế này:

Task.Factory.StartNew(() => 
{ 
    // Whatever code you want in your thread 
}); 

Lưu ý rằng các nhà máy nhiệm vụ cung cấp cho bạn tùy chọn thuận tiện bổ sung như ContinueWith:

Task.Factory.StartNew(() => {}).ContinueWith((result) => 
{ 
    // Whatever code should be executed after the newly started thread. 
}); 

Cũng lưu ý rằng một nhiệm vụ là một khái niệm hơi khác so với chủ đề. Chúng rất phù hợp với các từ khóa không đồng bộ/chờ đợi, xem here.

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