2010-05-21 35 views
6

Tôi cần một số cách để làm như sau hiệu quả trong C#:C# điểm dừng và tiếp tục

Make thực hiện chương trình dừng cho đến khi giá trị nhất định được thay đổi.

Lưu ý: Tôi không muốn làm cho nó với một vòng lặp while để tránh lãng phí năng lượng cpu ..

Edit: Và tôi muốn nó đáp ứng càng nhanh càng tốt sau khi giá trị đã thay đổi ..

Chỉnh sửa: Điều này sẽ nằm trong phương thức lớp được gọi bằng mã khác, tuy nhiên giá trị cần kiểm tra nằm trong lớp của tôi ... ode đánh giá và thay đổi giá trị của tôi .. sau đó nó phải tiếp tục làm công việc của nó .. không may điều này được thực hiện nhiều lần (vì vậy tôi cần phải chăm sóc cho hiệu suất)

+0

Ứng dụng này có phải là dịch vụ Windows không? Bạn không chỉ định, và nó không thực sự có ý nghĩa để thực sự tạm dừng thực hiện trong một ứng dụng tương tác (theo hướng sự kiện). – Aaronaught

+5

Yêu cầu của bạn là mâu thuẫn.Bạn từ chối bận chờ đợi vì tiêu thụ điện năng của nó, và bạn yêu cầu nó được ** càng nhạy càng tốt **, nhưng bận rộn chờ đợi là những gì sẽ được ** càng nhạy càng tốt **. Sẽ tốt hơn nếu bạn nói với chúng tôi về ngân sách * của bạn *. "Nhanh nhất có thể" không nói gì với chúng tôi; "trong vòng một phần nghìn giây" cho chúng ta biết khá nhiều. Một giải pháp đáp ứng trong vòng một phần nghìn giây có thể khác với một giải pháp đáp ứng với một micro giây hoặc đến một giây. –

+1

chính xác những gì bạn có ý nghĩa bằng cách thực hiện dừng? là một số chủ đề liên tục chạy mà bạn phải gián đoạn tại một điểm nhất định? làm thế nào để bạn có ý định làm cho nó dừng lại? hoặc nó giống như một sự kiện ngắn mà bạn muốn xảy ra khi thay đổi giá trị? –

Trả lời

15
+0

Không có 'Monitor.Set'. Ý của bạn là 'Monitor.Pulse' hoặc' Monitor.PulseAll'? – Aaronaught

+0

@ Aaronaught- vâng, có –

+0

Nếu bạn muốn ngủ hoàn toàn mà không cần kéo sợi, đây là cách để đi. Tuy nhiên, điều này đòi hỏi rằng mã đặt giá trị biết làm thế nào để xung vào đối tượng chính xác, hoặc mã của bạn sẽ không bao giờ thức dậy. – Stephan

6
while(some-condition-here) 
{ 
    Thread.CurrentThread.Sleep(100); // Release CPU for 100ms 
} 

Nó được gọi là spin-ngủ. Tất nhiên bạn có thể điều chỉnh 100 cho bất cứ điều gì bạn cảm thấy là phù hợp. Đó là cơ bản thời gian chờ cho mỗi lần kiểm tra.

Có nhiều cách khác để thực hiện, nhưng đây là cách dễ nhất và khá hiệu quả.

Nó thực sự được tham chiếu trong e-book:

Threading in C# by Joseph Albahari: Part 2: Basic Synchronization

+0

Tôi đã sử dụng điều này trước đây, nhưng tôi không phải là một fan hâm mộ của nó. (Vì vậy, tôi sẽ không mod câu trả lời của bạn lên hoặc xuống.) Nó luôn luôn "ngửi" sai với tôi. – Pretzel

+0

@Pretzel Tôi đã tham chiếu một cuốn sách (sách điện tử) nói về nó. – Aren

+0

Chỉ vì nó trong một cuốn sách không làm cho nó đúng. Ngoài ra, để trích dẫn tác giả, "Có lẽ việc sử dụng lớn nhất của nó là khi một lập trình viên đã từ bỏ việc xây dựng một hệ thống báo hiệu phức tạp hơn để làm việc!" –

7

Nếu giá trị mà bạn đang chờ đợi được thiết lập ở một nơi khác trong cùng một ứng dụng, bạn có thể sử dụng một tay cầm chờ đợi:

AutoResetEvent waitHandle = new AutoResetEvent(); 
... 
//thread will sleep here until waitHandle.Set is called 
waitHandle.WaitOne(); 
... 
//this is where the value is set 
someVar = someValue; 
waitHandle.Set(); 

(lưu ý WaitOne và Set phải xảy ra trên chủ đề riêng biệt như WaitOne sẽ chặn chủ đề nó được gọi là)

Nếu bạn không có quyền truy cập vào mã thay đổi giá trị, cách tốt nhất để làm điều đó, như những người khác đã nói, sử dụng vòng lặp để kiểm tra xem giá trị đã thay đổi chưa và sử dụng Thread.Sleep() để bạn không sử dụng nhiều thời gian xử lý:

while(!valueIsSet) 
{ 
    Thread.Sleep(100); 
} 
+0

/đồng ý ... đây là cách tốt nhất có thể – csauve

+0

Nếu mục tiêu là BLOCK một chuỗi, đây là cách tốt nhất. Để chặn luồng chính và ngăn chặn bất kỳ đầu vào mới nào cho đến khi sự kiện xảy ra, hãy đặt .WaitOne() trong chuỗi chính. Trong một chủ đề khác, trong đó giá trị kích hoạt wakeup, đặt .Set(); – Roast

3

Bạn có thể sử dụng mẫu thiết kế Observer. Nó được thiết kế để giải quyết các vấn đề như của bạn.

Mẫu này chủ yếu chứa chủ thể và người quan sát. Bạn có thể có nó để đáp ứng với bất kỳ thay đổi và rất nhanh chóng.

Bạn có thể tìm thêm thông tin và mã mẫu here

+0

Nếu kiến ​​trúc cho phép nó (tức là bạn có quyền kiểm soát những gì bạn đang theo dõi), đây có thể là một giải pháp tốt. Bạn nhận được phản hồi rất nhanh vì bạn nhận được sự kiện ngay sau khi thay đổi xảy ra. Thông báo trước chính là bạn đang thực hiện trong ngữ cảnh của luồng đã thực hiện thay đổi, đôi khi có thể có vấn đề. –

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