Tôi đã cố gắng sử dụng phương thức SwitchTo ngày hôm nay để chuyển sang chủ đề GUI và thấy rằng ví dụ tôi gỡ bỏ nó không hoạt động, đơn giản vì phương thức này không có.Tại sao "SwitchTo" bị xóa khỏi Async CTP/Release?
Sau đó tôi tìm thấy lời giới thiệu này here:
Lý do chúng tôi đã thoát khỏi nó là vì nó rất nguy hiểm. Cách khác là kết hợp mã của bạn bên trong TaskEx.Run ...
Câu hỏi của tôi đơn giản là: Tại sao có nguy hiểm không? Những nguy hiểm cụ thể sẽ sử dụng nó dẫn đến?
Lưu ý rằng tôi đã làm đọc phần còn lại của bài đăng đó, vì vậy tôi hiểu rằng có những giới hạn kỹ thuật ở đây. Câu hỏi của tôi vẫn là, nếu tôi biết điều này, tại sao lại là nguy hiểm?
Tôi đang xem xét việc thực hiện lại các phương thức trợ giúp để cung cấp cho tôi chức năng được chỉ định, nhưng nếu có điều gì đó bị hỏng, ngoài việc ai đó đã quyết định là nguy hiểm, tôi sẽ không làm điều đó.
Cụ thể, rất ngây thơ, dưới đây là cách tôi sẽ xem xét việc thực hiện các phương pháp cần thiết:
public static class ContextSwitcher
{
public static ThreadPoolContextSwitcher SwitchToThreadPool()
{
return new ThreadPoolContextSwitcher();
}
public static SynchronizationContextSwitcher SwitchTo(this SynchronizationContext synchronizationContext)
{
return new SynchronizationContextSwitcher(synchronizationContext);
}
}
public class SynchronizationContextSwitcher : INotifyCompletion
{
private readonly SynchronizationContext _SynchronizationContext;
public SynchronizationContextSwitcher(SynchronizationContext synchronizationContext)
{
_SynchronizationContext = synchronizationContext;
}
public SynchronizationContextSwitcher GetAwaiter()
{
return this;
}
public bool IsCompleted
{
get
{
return false;
}
}
public void OnCompleted(Action action)
{
_SynchronizationContext.Post(_ => action(), null);
}
public void GetResult()
{
}
}
public class ThreadPoolContextSwitcher : INotifyCompletion
{
public ThreadPoolContextSwitcher GetAwaiter()
{
return this;
}
public bool IsCompleted
{
get
{
return false;
}
}
public void OnCompleted(Action action)
{
ThreadPool.QueueUserWorkItem(_ => action(), null);
}
public void GetResult()
{
}
}
Điều này sẽ cho phép tôi viết mã như thế này:
public async void Test()
{
await ContextSwitcher.SwitchToThreadPool(); // ensure we're not bogging down the UI thread
// do some heavy processing
await _UIContext.SwitchTo(); // presumably saved from the main thread
// update UI with new data
}
Hah.Bây giờ đó là một chủ đề cũ! Tôi không bao giờ là một fan hâm mộ của Microsoft thỉnh thoảng "đó là vì lý do của chính bạn". –
Tôi đã chuyển sang làm 'chờ đợi Task.Run (async() => {}) '- không để tránh một số mối nguy hiểm trống rỗng, nhưng đơn giản bởi vì tôi nghĩ rằng nó dễ đọc hơn. Tôi nghĩ rằng ý tưởng của bạn về cách thực hiện 'SwitchTo()' là âm thanh, mặc dù. –
Không biết về cú pháp 'async() => {} ', cần điều tra thêm, cảm ơn! –