2014-05-12 17 views
10

Tôi đang cố gắng sử dụng hai phương pháp này (WP 8) trong windows phone 8.1, nhưng nó cung cấp lỗi và không biên dịch, có thể vì chúng bị loại bỏ. Tôi đã thử tìm kiếm các API mới nhưng không thể nhận được bất kỳ. Các lựa chọn thay thế khác cho chúng là gì.API mới cho windows phone 8.1

Dispatcher.BeginInvoke(() => {});msdn link

System.Threading.Thread.Sleep();msdn link

Trả lời

14

Chúng vẫn tồn tại cho Windows Phone 8.1 SIlverlight Apps, nhưng không tồn tại cho Windows Phone Store Apps. Các thay thế cho Windows Store Apps là:

Ngủ (xem Thread.Sleep replacement in .NET for Windows Store):

await System.Threading.Tasks.Task.Delay(TimeSpan.FromSeconds(30)); 

Dispatcher (xem How the Deployment.Current.Dispatcher.BeginInvoke work in windows store app?):

CoreDispatcher dispatcher = CoreWindow.GetForCurrentThread().Dispatcher; 
await dispatcher.RunAsync(CoreDispatcherPriority.Normal,() => { }); 
9

Dispatcher.BeginInvoke(() => {}); được thay thế bằng

await this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, async() => {}); 

System.Threading.Thread.Sleep(); được thay thế bằng

await Task.Delay(TimeSpan.FromSeconds(doubleValue)); 
+0

cảm ơn , nó hoạt động – IloveIniesta

1

Đối với Dispatcher, hãy thử này. MSDN

private async Task MyMethod() 
{ 
    await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,() => { }); 
} 

Đối Thread.Sleep() thử await Task.Delay(1000). MSDN

6

Lưu ý rằng không chỉ thay đổi API (chấp nhận API từ các ứng dụng WindowsStore), mà cách mà Dispatcher thu được trong windowsPhone 8.0 cũng đã thay đổi.

Đề xuất của @Johan Faulk, mặc dù sẽ hoạt động, có thể trả về null dưới nhiều điều kiện.

mã để lấy dispatcher:

var dispatcher = Deployment.Current.Dispatcher; 
or 
Deployment.Current.Dispatcher.BeginInvoke(()=>{ 
    // any code to modify UI or UI bound elements goes here 
}); 

mới trong Windows 8.1 triển khai không phải là một đối tượng có sẵn hoặc namespace.

Để đảm bảo chính UI Chủ đề phối thu được, sử dụng như sau:

var dispatcher = CoreApplication.MainView.CoreWindow.Dispatcher; 
or 
CoreApplication.MainWindow.CoreWindow.Dispatcher.RunAsync(
    CoreDispatcherPriority.Normal, 
()=>{ 
     // UI code goes here 
}); 

Thêm vào đó, mặc dù phương pháp này cho biết sẽ được thực thi Async từ khóa đang chờ đợi không thể được sử dụng trong phương pháp viện dẫn bởi RunAsync. (trong ví dụ trên là phương thức ẩn danh).

Để thực thi phương thức chờ trong phương pháp ẩn danh ở trên, hãy trang trí phương thức ẩn danh bên trong RunAsync() bằng từ khóa async.

CoreApplication.MainWindow.CoreWindow.Dispatcher.RunAsync(
CoreDispatcherPriority.Normal, 
**async**()=>{ 
     // UI code goes here 
     var response = **await** LongRunningMethodAsync(); 
}); 
+0

Mọi thứ đã thay đổi một lần nữa vì bài đăng này hoặc tôi thiếu gì đó?Vị trí của bạn chờ kết quả trong một lỗi cú pháp, cũng như mã của riêng tôi khi tôi di chuyển "đang chờ" từ trước Dispatcher đến trước phương thức ẩn danh. private async void PlayLaser() {DIspatcher.RunAsync (Windows.UI.Core.CoreDispatcherPriority.Normal, await() => {laser.Play();}); } (Tôi đã cố gắng không chờ chút nào nhưng âm thanh của tôi đôi khi quá chậm.) – sraboy

+0

Vui lòng cụ thể hơn, Windows 8.1 chưa thay đổi kể từ bài đăng này. Đối với Windows 10, đây có thể không phải là chuỗi thích hợp vì nó được đánh dấu WindowsPhone 8.1. Nhiều API đã thay đổi hoàn toàn trên WindowsPhone 10 để thống nhất hệ điều hành. –

+0

Tôi đang sử dụng Windows 10 nhưng xây dựng một ứng dụng toàn cầu cho 8.1 và Điện thoại 8.1 với VS2015. Nó không phải là Win10 Universal. – sraboy

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