2011-12-13 21 views
12

Tôi muốn phương pháp đợi khoảng 500 ms và sau đó kiểm tra xem một số cờ đã thay đổi chưa. Làm cách nào để hoàn tất việc này mà không chặn phần còn lại của đơn đăng ký của tôi?C# đợi một lúc mà không chặn

+6

Câu hỏi chưa được xác định rõ ràng; chúng ta cần phải biết "phần còn lại của ứng dụng" là gì - là nó đang chạy trên cùng một luồng, các luồng khác nhau, một máy khác, cái gì? Điều đó nói rằng, gần như tất cả các câu trả lời cho đến nay là nguy hiểm. Sử dụng một trong hai DoEvents hoặc Thread.Sleep là thực hành tồi tệ nhất cho thấy một ứng dụng được thiết kế tồi tệ có nguy cơ bị lỗi tái phạm khó chịu. Câu trả lời của Tudor là câu trả lời hay nhất: sử dụng bộ hẹn giờ. –

+4

Ngoài ra, hãy xem xét điều tra phiên bản Cync Async của C# 5. Chúng tôi đã thêm luồng điều khiển cho phép bạn dễ dàng trì hoãn 500 mili giây và bắt đầu từ nơi bạn đã dừng lại mà không chặn bất kỳ chủ đề nào hoặc bắt đầu các vòng tin nhắn mới. –

Trả lời

25

Thread.Sleep (500) sẽ buộc luồng hiện tại phải chờ 500ms. Nó hoạt động, nhưng nó không phải là những gì bạn muốn nếu toàn bộ ứng dụng của bạn đang chạy trên một luồng.

Trong trường hợp đó, bạn sẽ muốn sử dụng một Timer, như vậy:

using System.Timers; 

void Main() 
{ 
    Timer t = new Timer(); 
    t.Interval = 500; //In milliseconds here 
    t.AutoReset = true; //Stops it from repeating 
    t.Elapsed += new ElapsedEventHandler(TimerElapsed); 
    t.Start(); 
} 

void TimerElapsed(object sender, ElapsedEventArgs e) 
{ 
    Console.WriteLine("Hello, world!"); 
} 

Bạn cũng có thể thiết lập AutoReset false (hoặc không đặt nó ở tất cả) nếu bạn muốn hẹn giờ để lặp lại chính nó .

+2

Chỉ cần chỉnh sửa nhẹ, 'Interval'property có giá trị trong ** mili giây **, không giây [link] (http://msdn.microsoft.com/en-us/library/system.timers.timer.interval (v = vs.110) .aspx) –

+0

** chủ đề hiện tại ** rất hữu ích. sai lầm nghĩ rằng 'Thread.Sleep' làm cho chủ đề chính ngủ. –

+0

Tôi nghĩ rằng bạn có sử dụng AutoReset ngược Đặt nó thành true hoặc không thiết lập nó ở tất cả có bộ đếm thời gian lặp lại chính nó. [link] (https: // msdn.microsoft.com/en-us/library/s ystem.timers.timer.autoreset% 28v = vs.110% 29.aspx? f = 255 & MSPPError = -2147217396) – JochemKempe

5

Nó phương pháp trong câu hỏi được thực hiện trên một sợi khác so với phần còn lại của ứng dụng của bạn, sau đó làm như sau:

Thread.Sleep(500); 
+1

làm thế nào về nếu tất cả mọi thứ làm việc trên một thraed? – santBart

+0

@ user898569 theo định nghĩa nếu bạn muốn "chờ đợi somthing" một cái gì đó cần phải ngồi đó "chờ đợi". Vì vậy, không, bạn phải sử dụng một chủ đề khác hoặc nó sẽ chặn chương trình của bạn. Xem [Câu trả lời của Tudor] (http://stackoverflow.com/a/8496300/80274) để biết cách kích hoạt sự kiện sẽ chạy trên luồng chính nhưng nó sẽ không "chờ" nó sẽ chỉ là một sự kiện định kỳ. –

+0

Câu hỏi thú vị. Tôi đề nghị bạn đọc lên trên lập trình không đồng bộ trong .NET. Đây là một liên kết đến một điểm khởi đầu tốt: http://msdn.microsoft.com/en-us/vstudio/gg316360 –

2
System.Threading.Thread.Sleep(500); 

Cập nhật

này sẽ không chặn phần còn lại của ứng dụng của bạn, chỉ là chuỗi đang chạy phương thức của bạn.

+0

bất kỳ phương án nào khác? – santBart

+0

Lol, tôi mất hơn 7 giây để nhập vì tôi đặt vào không gian tên. Không phải là đầu tiên: ( – danludwig

7

Tôi thực sự không hiểu câu hỏi.

Nếu bạn muốn chặn trước khi kiểm tra, sử dụng Thread.Sleep(500);

Nếu bạn muốn kiểm tra không đồng bộ mỗi x giây, bạn có thể sử dụng một Timer để thực hiện một handler mỗi x mili giây.

Điều này sẽ không chặn chuỗi hiện tại của bạn.

+1

Tôi nghĩ đây là những gì OP cần. – Otiel

+0

Nếu đó là một ứng dụng GUI, thì tốt nhất nên sử dụng bộ đếm thời gian cụ thể cho thư viện GUI được sử dụng (ví dụ: 'DispatcherTimer' trong trường hợp của WPF) – svick

+0

Có một sự khác biệt giữa "kiểm tra mỗi x giây" và "chờ đợi x giây và sau đó kiểm tra". Tôi tin rằng OP muốn cái sau. –

0

Sử dụng một bộ đếm thời gian nên làm các trick

nếu bạn cần phải sử dụng một sợi thì đây là một ví dụ

void Main() 
{ 
    System.Threading.Thread check= new System.Threading.Thread(CheckMethod); 
    check.Start(); 
} 

private void CheckMethod() 
{ 
    //Code 
    Thread.Sleep(500); 
} 
0

Asynchron Nhiệm vụ:

var task = new Task (() => function_test()); task.Start(); 

public void function_test() { `Wait for 5000 miliseconds` Task.Delay(5000);` } 
2

Bạn có thể sử dụng await Task.Delay(500); mà không ngăn chặn chủ đề như Sleep có và ít mã hơn so với Bộ hẹn giờ.

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