Tôi muốn sử dụng async/await trên cửa sổ điện thoại của tôi 8 MVVM dự án và tôi đang đấu tranh để tìm một cách tốt để thực hiện ICommands của tôi bằng cách sử dụng api này. Tôi đã đọc một vài bài viết về chủ đề này và tôi đã gặp phải vấn đề này từ MSDN bên dưới, trong đó nêu rõ rằng tôi phải tránh những khoảng trống không đồng bộ vì khó nhận được các ngoại lệ chưa được xử lý: http://msdn.microsoft.com/en-us/magazine/jj991977.aspx Trong một câu hỏi khác tôi đã hỏi về chủ đề, ai đó cũng nói rằng tôi không nên sử dụng các khoảng trống không đồng bộ. Trừ khi có sự kiện.async/await trong MVVM mà không có phương pháp Void
Nhưng vấn đề là tất cả các ví dụ tôi có thể tìm thấy trên internet sử dụng khoảng trống không đồng bộ. này hai bài báo tôi thấy là những ví dụ: http://richnewman.wordpress.com/2012/12/03/tutorial-asynchronous-programming-async-and-await-for-beginners/ và http://blog.mycupof.net/2012/08/23/mvvm-asyncdelegatecommand-what-asyncawait-can-do-for-uidevelopment/
Người cuối cùng là một thực hiện ICommand sử dụng async/chờ đợi, nhưng nó cũng sử dụng khoảng trống async. Tôi đang cố gắng để tìm ra một giải pháp cho điều này, vì vậy tôi đã viết thực hiện này của ICommand dựa trên RelayCommand:
public delegate Task AsyncAction();
public class RelayCommandAsync : ICommand
{
private AsyncAction _handler;
public RelayCommandAsync(AsyncAction handler)
{
_handler = handler;
}
private bool _isEnabled;
public bool IsEnabled
{
get { return _isEnabled; }
set
{
if (value != _isEnabled)
{
_isEnabled = value;
if (CanExecuteChanged != null)
{
CanExecuteChanged(this, EventArgs.Empty);
}
}
}
}
public bool CanExecute(object parameter)
{
return IsEnabled;
}
public event EventHandler CanExecuteChanged;
public void Execute(object parameter)
{
ExecuteAsync();
}
private Task ExecuteAsync()
{
return _handler();
}
}
Và tôi đang cố gắng để sử dụng nó như thế này: trong constructor:
saveCommand = new RelayCommandAsync(SaveSourceAsync);
thì:
private async Task SaveSourceAsync()
{
await Task.Run(() => { Save(); });
}
private void Save()
{
// Slow operation
}
vấn đề là tôi không cảm thấy thoải mái với điều này và bất kỳ thực hiện khác như tôi không biết đó là tốt nhất và tối ưu.
Bất kỳ ai có thể đưa ra một số ánh sáng về cách tôi nên sử dụng nó, tốt nhất là với MVVM?
Tôi đang xem xét trong thư viện và triển khai của bạn. Vì vậy, hãy cho tôi biết điều gì đó, với việc thực hiện ICommand cho bài đăng trên blog tôi đặt ở đây, nếu một ngoại lệ xảy ra sẽ nếu tăng sự kiện ngoại lệ chưa được giải quyết trong Windows Phone App.xaml? Tôi sẽ kiểm tra sau. –
Tôi đã nhìn vào 'SimpleAsyncCommand', có vẻ như nó hoạt động theo mục đích của tôi, tôi chỉ muốn biết: Nethod của tôi là' ExecuteAsync' sẽ gọi là đang chạy trong ngữ cảnh UI và tôi phải sử dụng 'await Task.Run' trong phương thức này, đúng không? Tôi có bị mất bất kỳ ngoại lệ nào hoạt động như thế này không? Nếu không, tôi nghĩ rằng tôi sẽ sử dụng lib của bạn! –
Các ngoại lệ từ 'ICommand's sẽ được nâng lên trên giao diện người dùng WP, vì vậy chúng sẽ được gửi đến' Application.UnhandledException'. 'ExecuteAsync' sẽ được thực hiện trên luồng giao diện người dùng (do đó ủy nhiệm' async' của bạn sẽ bắt đầu chạy trên chuỗi giao diện người dùng). Bạn có thể sử dụng 'await Task.Run' nếu bạn đã chặn công việc để làm cho lệnh đó; nếu bạn có công việc không đồng bộ để làm, bạn sẽ không cần 'Task.Run' và chỉ có thể sử dụng' await'. Và nó không thực sự là một phần của lib của tôi; bạn sẽ phải sao chép nguồn ngay bây giờ. –