Trong .NET, Windows 8 và Windows Phone 7 tôi có mã tương tự như sau:di động thư viện lớp tương đương của Dispatcher.Invoke hoặc Dispatcher.RunAsync
public static void InvokeIfRequired(this Dispatcher dispatcher, Action action)
{
if (dispatcher.CheckAccess())
{
action();
}
else
{
dispatcher.Invoke(action);
}
}
Làm thế nào tôi sẽ làm một cái gì đó trong thư viện lớp cầm tay? Sẽ thật tuyệt khi có một nền tảng triển khai độc lập về điều này. Ý tưởng của tôi là sử dụng TPL mà không có sẵn trong WP7 nhưng chắc chắn sẽ sớm.
// PortableDispatcher must be created on the UI thread and then made accessible
// maybe as a property in my ViewModel base class.
public class PortableDispatcher
{
private TaskScheduler taskScheduler = TaskScheduler.FromCurrentSynchronizationContext();
public void Invoke(Action action)
{
if (Alread on UI thread. How would I do this.)
{
action();
}
Task.Factory.StartNew(
action,
CancellationToken.None,
TaskCreationOptions.None,
taskScheduler);
}
}
Điều duy nhất tôi không chắc chắn về ý nghĩa hiệu suất của việc này là gì. Có lẽ tôi sẽ làm một số xét nghiệm.
Tốt. Có vẻ như bạn đã tạo một lớp nhưng chỉ đăng phương thức để ghi chú (có thể hiển nhiên) cho người khác. this.synchronizationContext phải được gán trong chuỗi bạn muốn hành động chạy trước khi gọi phương thức. Tôi thực sự sửa đổi ở trên một chút và tạo ra một phần mở rộng: public Task RunAsync (bối cảnh SynchronizationContext này, Action action). Bây giờ nó giống như câu trả lời ban đầu vì nó có thể đứng một mình. Tốt nhất của cả hai câu trả lời. :) – Wes