Thay thế Thread.Sleep trong .NET cho Windows Store


98

Thread.Sleep dường như không được hỗ trợ trong các ứng dụng .NET dành cho Windows Store.

Ví dụ, điều này

System.Threading.Thread.Sleep(1000);

sẽ biên dịch khi nhắm mục tiêu bất kỳ .NET Framework nào (2.0, 3.5, 4.0, 4.5), nhưng không phải khi nhắm mục tiêu các ứng dụng .NET cho Windows Store (hoặc trong thư viện lớp di động nhắm mục tiêu cả 4.5 và store).

System.Threading.Thread vẫn ở đó, chỉ là nó không có phương thức Sleep.

Tôi cần trì hoãn điều gì đó trong vài giây trong ứng dụng của mình, có cách thay thế phù hợp không?

CHỈNH SỬA lý do tại sao cần trì hoãn: Ứng dụng của tôi là một trò chơi và việc trì hoãn là để làm cho nó trông giống như đối thủ máy tính đang "suy nghĩ" về động thái tiếp theo của mình. Phương thức này đã được gọi là không đồng bộ (luồng chính không bị chặn), tôi chỉ muốn làm chậm thời gian phản hồi.


2
Xem xét các ứng dụng Windows Store không được cho là có thể đóng băng giao diện người dùng (mọi thứ được cho là không đồng bộ) thì có nghĩa là nó không được hỗ trợ.
Nghiêm túc

2
Bạn có Sự kiện hoặc Monitorlớp học không? Bạn có thể sử dụng Waitphương pháp có thời gian chờ để mô phỏng một giấc ngủ.
Tudor

cái này dành cho Apptivate.ms? : 3
EaterOfCode

3
Yay vì đã bị trục xuất Thread.Sleepvào thùng rác của công nghệ tồi.
tiêu

Câu trả lời:


203

Các ứng dụng Windows Store bao gồm tính không đồng bộ - và "tạm dừng không đồng bộ" được cung cấp bởi Task.Delay. Vì vậy, trong một phương thức không đồng bộ, bạn sẽ viết:

await Task.Delay(TimeSpan.FromSeconds(30));

... hoặc bất kỳ sự chậm trễ nào bạn muốn. Phương thức không đồng bộ sẽ tiếp tục sau 30 giây, nhưng luồng sẽ không bị chặn, giống như đối với tất cả các awaitbiểu thức.


1
Thật không may, Task.Delay dường như không được hỗ trợ khi nhắm mục tiêu .NET 4.5 + store + WP7 trong thư viện lớp di động .. Tôi đoán tôi sẽ chuyển điều này vào các lớp cụ thể của nền tảng.
Tối đa

1
@Max: Không, vì nó không tồn tại trước .NET 4.5. IIRC, bản thân WP7 không có bất kỳ hỗ trợ TPL nào. (Tôi có thể sai ...)
Jon Skeet

4
Bạn có thể bổ sung .RunSynchronously()nếu cần.
HappyNomad

1
@RAM: Cũng Thread.Sleep được hỗ trợ trong .NET 3.5, vì vậy câu hỏi không áp dụng. Không nghi ngờ gì bạn có một câu hỏi, nhưng nó không giống như câu hỏi này. Vui lòng đọc tinyurl.com/stack-hints rồi đặt câu hỏi mới.
Jon Skeet

2
@RAM: Tôi không chắc làm thế nào tôi có thể đoán được điều đó từ nhận xét của bạn. Đã có rất nhiều câu hỏi tương tự trên SO về WPF và hoạt ảnh.
Jon Skeet

46

Ghét nói rõ ràng nhưng trong trường hợp ai đó muốn một dòng duy nhất System.Threading.Tasks.Task.Delay(3000).Wait()


20

Tôi vừa gặp vấn đề tương tự và tìm thấy một giải pháp thú vị khác mà tôi muốn chia sẻ với bạn. Nếu bạn thực sự muốn chặn luồng, tôi sẽ làm như thế này (cảm ơn @Brannon về gợi ý "mỏng"):

// `waitHandle.Set` is never called, so we wait always until the timeout occurs
using (var waitHandle = new ManualResetEventSlim(initialState: false))
{
    waitHandle.Wait(TimeSpan.FromSeconds(5));
}

Đây là câu trả lời tốt nhất cho mã hóa di động.
zezba9000

Sử dụng phiên bản "mỏng" của cái này.
Brannon,

11

MainPage.xaml.cs

public MainPage()
{
  this.InitializeComponent();
  this.WaitForFiveSeconds();
}

private async void WaitForFiveSeconds()
{
  await System.Threading.Tasks.Task.Delay(TimeSpan.FromSeconds(5));
  // do something after 5 seconds!
}

-7

Hầu như KHÔNG có lý do gì (ngoại trừ mục đích thử nghiệm) để sử dụng BAO GIỜ Thread.Sleep().

NẾU (và chỉ khi) bạn có một lý do chính đáng để gửi một luồng ở chế độ ngủ, bạn có thể muốn kiểm tra Task.Delay(), bạn có thể chờ "đợi" trong một thời gian cụ thể. Mặc dù không bao giờ là một ý kiến ​​hay nếu bạn chỉ ngồi một chỗ và không làm gì cả. Thực hành không tốt ...


9
Tôi không đồng ý. Nếu luồng là một luồng nền và thời gian tạm nghỉ ngắn thì việc đặt nó ở chế độ ngủ trong vài mili giây sẽ hiệu quả hơn so với sử dụng bộ hẹn giờ.
Jason Steele

1
và đôi khi bạn được yêu cầu làm điều đó mặc dù đã tư vấn cho nhân vật có thẩm quyền về hậu quả;)
Jordan
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.