Cách thêm độ trễ trong 2 hoặc 3 giây [đã đóng]


129

Làm cách nào để thêm độ trễ cho chương trình trong C #?


2
Có một số cách để làm điều này, nhưng tại sao bạn cần thêm một độ trễ? Nếu chúng ta biết thì chúng ta có thể đề xuất cách thích hợp nhất để làm điều đó.
ChrisF

3
Câu hỏi này vô vọng dưới tài liệu để từng đề xuất Thread.S ngủ ().
Hans Passant

1
Chỉ để làm rõ, tôi đã bỏ phiếu để đóng câu hỏi này vì bạn chưa cung cấp đủ chi tiết cho bất cứ ai để đưa ra một câu trả lời hay, chất lượng. Tôi hoàn toàn sẵn sàng mở lại nó như một câu hỏi hợp lệ nếu bạn thêm một số chi tiết về chính xác những gì bạn đang cố gắng làm. Bỏ phiếu để đóng cửa sớm là một cách để ngăn chặn một loạt các câu trả lời "tiếng ồn" cho các câu hỏi kém chất lượng. Khi bạn đã thêm chi tiết, hãy để lại cho tôi một nhận xét và / hoặc gắn cờ một mod để mở lại.
Cody Grey

14
Quyết định xấu để đóng câu hỏi này. Đó là một câu hỏi, và nó có thể là chung chung về bản chất. Tôi hiểu nó một cách hoàn hảo.
dùng2430797

5
Một câu hỏi khác mà tôi đang tìm kiếm, được trả lời bằng một câu hỏi đã bị đóng mà không có lý do.
Glenn Maynard

Câu trả lời:


176

Bạn có thể sử dụng Thread.Sleep()chức năng, ví dụ

int milliseconds = 2000;
Thread.Sleep(milliseconds);

hoàn toàn dừng lại việc thực hiện các chủ đề hiện tại trong 2 giây.

Có lẽ kịch bản thích hợp nhất Thread.Sleeplà khi bạn muốn trì hoãn các hoạt động trong một luồng khác, khác với chính, ví dụ:

 MAIN THREAD        --------------------------------------------------------->
 (UI, CONSOLE ETC.)      |                                      |
                         |                                      |
 OTHER THREAD            ----- ADD A DELAY (Thread.Sleep) ------>

Đối với các tình huống khác (ví dụ: bắt đầu hoạt động sau một thời gian, v.v.) hãy kiểm tra câu trả lời của Cody .


13
Tránh sử dụng Thead.S ngủ nguyên nhân Nó sẽ chặn hoàn toàn Chủ đề hiện tại làm BẤT KY việc gì cho đến khi thời lượng kết thúc.
Mohammed Swillam

7
@Mohammed: vâng, tất nhiên nó sẽ chặn hoàn toàn bước đi. Nhưng đôi khi nó có thể hữu ích ... nó thực sự phụ thuộc vào những gì OP cần ...
digEmAll

12
Vì tôi không thể đăng câu trả lời mới, tôi muốn bình luận - Nếu bạn không muốn nó chặn chương trình, bạn có thể sử dụng await Task.Delay(milliseconds). Điều này làm việc cho tôi :)
SaiyanGirl

Trong trường hợp của tôi, tôi không thể sử dụng chờ đợi vì tôi được gọi từ một phần của chương trình được viết bởi người khác. Nó không phải là chờ đợi nhưng nếu tôi "treo" tôi có thể làm việc trong 10 giây trước khi công cụ của tôi bị tắt. Ngủ 2 giây hoạt động như một bùa mê;) Vì vậy, trong một số trường hợp, đây là cách.
ecth

@MohammedElSayed: Câu trả lời là tùy thuộc. Tất cả phụ thuộc vào ý định sử dụng. Đối với trường hợp của tôi, tôi cần ngủ chính xác luồng trong 0,6 giây để tránh ràng buộc chỉ mục khi chèn vào cơ sở dữ liệu.
GunWanderer

61

Sử dụng bộ hẹn giờ với khoảng thời gian được đặt thành 2 trận3 giây.

Bạn có ba tùy chọn khác nhau để lựa chọn, tùy thuộc vào loại ứng dụng bạn đang viết:

  1. System.Timers.Timer
  2. System.Windows.Forms.Timer
  3. System.Threading.Timer

Không sử dụng Thread.Sleepnếu ứng dụng của bạn cần xử lý bất kỳ đầu vào nào trên luồng đó cùng một lúc (WinForms, WPF), vì Sleepsẽ khóa hoàn toàn luồng và ngăn không cho xử lý các tin nhắn khác. Giả sử một ứng dụng đơn luồng (như hầu hết là vậy), toàn bộ ứng dụng của bạn sẽ ngừng đáp ứng, thay vì chỉ trì hoãn một hoạt động như bạn có thể dự định. Lưu ý rằng có thể sử dụng chế độ Ngủ trong ứng dụng bảng điều khiển thuần túy vì không có "sự kiện" nào để xử lý hoặc trên luồng riêng biệt (cũng Task.Delaylà tùy chọn tốt hơn).

Ngoài bộ tính giờ và Sleepbạn có thể sử dụng Task.Delayphiên bản không đồng bộ Sleep, không chặn luồng xử lý các sự kiện (nếu được sử dụng đúng cách - đừng biến nó thành giấc ngủ vô hạn với .Wait()).

 public async void ClickHandler(...)
 {
      // whatever you need to do before delay goes here         

      await Task.Delay(2000);

      // whatever you need to do after delay.
 }

Điều tương tự await Task.Delay(2000)có thể được sử dụng trong một Mainphương thức của ứng dụng bảng điều khiển nếu bạn sử dụng C # 7.1 ( Async chính trên blog MSDN ).

Lưu ý: trì hoãn hoạt động với Sleeplợi ích của việc tránh các điều kiện cuộc đua xuất phát từ khả năng bắt đầu nhiều hoạt động với bộ định thời / Delay. Thật không may, việc đóng băng ứng dụng dựa trên UI không được chấp nhận vì vậy bạn cần suy nghĩ về những gì sẽ xảy ra nếu bạn bắt đầu nhiều lần trì hoãn (nghĩa là nếu nó được kích hoạt bằng một lần bấm nút) - hãy xem xét việc vô hiệu hóa nút đó hoặc hủy bộ đếm thời gian / tác vụ hoặc đảm bảo trì hoãn hoạt động có thể được thực hiện nhiều lần một cách an toàn.


5
Nếu đó là một ứng dụng giao diện điều khiển, Thread.Sleepcảnh báo có thể không quan trọng.
Merlyn Morgan-Graham

1
Có một bộ đếm thời gian thứ 4: System.Web.UI.Timer , một thành phần ASP.NET thực hiện các postback trang web không đồng bộ hoặc đồng bộ tại một khoảng thời gian thông thường.
David

1
Nên là câu trả lời hàng đầu. Nếu điều này có một ví dụ cho việc sử dụng một trong các bộ tính giờ, nó sẽ nhận được nhiều phiếu hơn ...
Mercutio

Cody Grey, bạn có thể thêm await Task.Delay()phiên bản và nhận xét nội tuyến mà ứng dụng bảng điều khiển thực sự có khả năng muốn sử dụng Sleep(không đồng bộ Main) hoặc Delay(không đồng bộ Main)
Alexei Levenkov

1
@CodyGray đã xong.
Alexei Levenkov


6
System.Threading.Thread.Sleep(
    (int)System.TimeSpan.FromSeconds(3).TotalMilliseconds);

Hoặc với usingtuyên bố:

Thread.Sleep((int)TimeSpan.FromSeconds(2).TotalMilliseconds);

Tôi thích điều này hơn 1000 * numSeconds(hoặc đơn giản 3000) bởi vì nó làm cho nó rõ ràng hơn những gì đang xảy ra với người chưa từng sử dụng Thread.Sleeptrước đây. Nó tốt hơn tài liệu ý định của bạn.


2
+1 cho TimeSpan trên 1000 *
Lefty

Với .NET 4 trở đi, bạn có thể sử dụng Thread.Sleep(TimeSpan)trực tiếp mà không cần phải chuyển sang int.
Holf
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.