2010-02-12 5 views
5

i có mã này trong C#:đề kích hoạt C#

Thread t1 = new Thread(functionsActivations(3, 4000, 0, 4)); 
Thread t2 = new Thread(functionsActivations(3, 4000, 5, 9)); 
t1.start(); 
t2.Start(); 
Thread t3 = new Thread(functionsActivations(4, 4000, 0, 4)); 
Thread t4 = new Thread(functionsActivations(4, 4000, 5, 9)); 

Nó không phải là làm việc. Làm thế nào tôi có thể nói nó để gọi phương pháp tôi đã cho nó? Thứ hai, tôi muốn t3 và t4 được kích hoạt sau khi t1 và t2 kết thúc chạy. Làm thế nào tôi có thể làm điều đó? Thứ ba, tôi muốn t1 và t2 không chặn (do đó t2 sẽ không phải chờ cho đến khi t1 kết thúc). Là những gì tôi đã làm đúng?

+0

oh, tôi không biết rằng ... – aharon

+2

Yea mate, 2/11 Chấp nhận không tốt.Đi qua những câu hỏi đó và đánh dấu những câu hỏi đã trả lời tình huống của bạn như được chấp nhận. –

Trả lời

4

"Nó không hoạt động" không phải là một tập hợp các triệu chứng rất rõ ràng. Bạn đang quan sát điều gì?

EDIT: OK, bây giờ bạn đã nói lỗi trình biên dịch là gì, dễ chẩn đoán hơn nhiều. Bạn hiện đang gọi một phương thức và cố gắng sử dụng kết quả làm nhiệm vụ cho chuỗi để thực hiện. Giả sử bạn thực muốn làm cho rằng phương thức gọi khi thread được bắt đầu, bạn muốn một cái gì đó như thế này:

C# 2:

Thread t1 = new Thread(delegate() { functionsActivations(3, 4000, 0, 4); }); 

C# 3:

Thread t1 = new Thread(() => functionsActivations(3, 4000, 0, 4)); 

Một altnerative để có biểu thức lambda ở khắp mọi nơi sẽ là viết một phương thức tiện ích:

private static Action DeferFunctionActivations(int a, int b, int c, int d) 
{ 
    return() => functionsActivations(a, b, d, d); 
} 

Sau đó, bạn có thể sử dụng:

Thread t1 = new Thread(DeferFunctionActivations(3, 4000, 0, 4)); 

, vv

Đối với phần còn lại của bài Tôi sẽ giả C# 3.

Bên cạnh đó, t1.start() nên t1.Start() - C# là trường hợp nhạy cảm.

Để trả lời điểm cuối cùng của bạn, t1t2 hiện độc lập - chúng sẽ không chặn nhau trừ khi bạn đã đồng bộ hóa ở đâu đó trong mã mà chúng đang chạy.

Nếu bạn chỉ muốn t3t4 để bắt đầu khi t1t2 đã kết thúc, bạn có thể sử dụng Thread.Join:

Thread t1 = new Thread(() => functionsActivations(3, 4000, 0, 4)); 
Thread t2 = new Thread(() => functionsActivations(3, 4000, 5, 9)); 
t1.Start(); 
t2.Start(); 
t1.Join(); 
t2.Join(); 
Thread t3 = new Thread(() => functionsActivations(4, 4000, 0, 4)); 
Thread t4 = new Thread(() => functionsActivations(4, 4000, 5, 9)); 
t3.Start(); 
t4.Start(); 

Lưu ý rằng đó có nghĩa là chủ đề này sẽ đợi cho đến t1t2 đã hoàn thành, quá. Nếu điều đó không đủ tốt cho bạn, có nhiều lựa chọn khác nhau nhưng về cơ bản bạn sẽ muốn một cái gì đó khác để chờ đợi một cách không đồng bộ cho t1 và t2 để hoàn thành. Ví dụ, bạn có thể tie lên một chủ đề phụ để làm điều đó:

Thread t1 = new Thread(() => functionsActivations(3, 4000, 0, 4)); 
Thread t2 = new Thread(() => functionsActivations(3, 4000, 5, 9)); 
t1.Start(); 
t2.Start(); 
Thread t3 = new Thread(() => functionsActivations(4, 4000, 0, 4)); 
Thread t4 = new Thread(() => functionsActivations(4, 4000, 5, 9)); 
Thread t5 = new Thread(() => 
{ 
    t1.Join(); 
    t2.Join(); 
    t3.Start(); 
    t4.Start(); 
}); 
t5.Start(); 

Hơi icky, nhưng nó phải làm việc.

Bạn có thể sử dụng .NET 4.0 không? Nếu vậy, khung công tác mở rộng song song sẽ làm cho việc này trở nên dễ dàng hơn nhiều.

+0

cảm ơn! bạn đã giải quyết cho tôi hai câu hỏi cuối cùng, nhưng không phải là câu hỏi đầu tiên. nó không hoạt động từ lý do khác, vấn đề là trong chức năng tôi đã cho các chủ đề trong ctor thứ. nó nói với tôi rằng anh ta không thể chuyển đổi từ void để system.threading.threadstart ... – aharon

+0

Tại sao bạn đi qua một constructor đến một thread? Bạn đang cố làm gì vậy? Tạo một đối tượng trong một chủ đề vì việc xây dựng mất một thời gian dài? – Dave

+0

không, mã số nằm trong ctor, tôi chuyển funcgtions thông thường đến luồng – aharon