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
Trả lời
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ó .
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) –
** 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ủ. –
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
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);
làm thế nào về nếu tất cả mọi thứ làm việc trên một thraed? – santBart
@ 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ỳ. –
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 –
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.
Tôi nghĩ đây là những gì OP cần. – Otiel
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
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. –
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);
}
Asynchron Nhiệm vụ:
var task = new Task (() => function_test()); task.Start();
public void function_test() { `Wait for 5000 miliseconds` Task.Delay(5000);` }
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ờ.
- 1. C + + ngăn chặn hàng đợi chặn bế tắc (tôi nghĩ)
- 2. quá trình xóa mà không cần chờ đợi C
- 3. Ngăn chặn một bế tắc khi gọi một phương pháp async mà không sử dụng chờ đợi
- 4. Hàng đợi chặn đồng bộ pthread
- 5. Hiểu async/chờ đợi mà không đề
- 6. Có hàng đợi chặn công bằng (không bị chặn) nào trong java không?
- 7. C# không đồng bộ, đang chờ đợi mà không có nhiệm vụ
- 8. Tải xuống javascript mà không bị chặn
- 9. chờ đợi chặn Non trong python
- 10. Future.wait() không thể chờ đợi mà không có chất xơ (trong khi chờ đợi một tương lai khác trong Meteor.method)
- 11. Ajax Heartbeat sử dụng setInterval, Ngăn chặn nhiều cuộc gọi cùng một lúc
- 12. Chờ mà không chặn chủ đề? - Làm sao?
- 13. Chờ chặn thu (hàng đợi) để giảm kích thước trong C#
- 14. Đợi bảng tính.RefreshAll() (C#)
- 15. C++ có hàng đợi tiêu chuẩn không?
- 16. Hàng đợi đồng thời và chặn trong Java
- 17. nohup trên windows, exec mà không cần đợi kết thúc
- 18. C# Luồng và Hàng đợi
- 19. PHP CLI: Cách đọc một ký tự đầu vào duy nhất từ TTY (mà không phải đợi khóa nhập)?
- 20. .NET C# Nhận đồng bộ không chặn
- 21. Cách đọc từ os.pipe() mà không bị chặn?
- 22. Trả lại dữ liệu từ AsyncTask mà không chặn UI
- 23. Chức năng chờ không chặn trong Mục tiêu-C
- 24. Nhiều hàng đợi chặn, người tiêu dùng duy nhất
- 25. Hàng đợi Đầy đủ, Chiều sâu của Hàng đợi Chặn, làm rõ cần thiết
- 26. Ổ cắm không chặn: Các thư có được xếp hàng đợi không?
- 27. C# Hàng đợi hoặc ServiceBus không có phụ thuộc?
- 28. Chặn tệp Java không có ngoại lệ; chờ đợi trên khóa
- 29. python pool apply_async và map_async không chặn trên hàng đợi đầy đủ
- 30. Hành vi con trỏ không mong đợi trong C++
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ờ. –
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. –