Làm cách nào để thêm độ trễ cho chương trình trong C #?
Làm cách nào để thêm độ trễ cho chương trình trong C #?
Câu trả lời:
Bạn có thể sử dụng Thread.Sleep()
chức năng, ví dụ
int milliseconds = 2000;
Thread.Sleep(milliseconds);
mà 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.Sleep
là 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 .
await Task.Delay(milliseconds)
. Điều này làm việc cho tôi :)
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:
Không sử dụng Thread.Sleep
nế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ì Sleep
sẽ 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.Delay
là tùy chọn tốt hơn).
Ngoài bộ tính giờ và Sleep
bạn có thể sử dụng Task.Delay
phiê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 Main
phươ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 Sleep
lợ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.
Thread.Sleep
cảnh báo có thể không quan trọng.
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
)
Trong 2,3 giây bạn nên làm:
System.Threading.Thread.Sleep(2300);
System.Threading.Thread.Sleep(
(int)System.TimeSpan.FromSeconds(3).TotalMilliseconds);
Hoặc với using
tuyê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.Sleep
trước đây. Nó tốt hơn tài liệu ý định của bạn.
Thread.Sleep(TimeSpan)
trực tiếp mà không cần phải chuyển sang int.