Tôi đang cố gắng tìm hiểu về SynchronizationContext
và bạn bè. Nếu tôi đặt ngữ cảnh đồng bộ hóa tùy chỉnh ở đầu, ví dụ: một ứng dụng giao diện điều khiển. Trong điều kiện nào thì ngữ cảnh đồng bộ hóa hiện tại sẽ hoạt động với các hoạt động không đồng bộ của tôi? Có sự khác biệt giữa Task
và các điểm khác, ví dụ: Delegate.BeginInvoke
?Đồng bộ hóaTiếp theo, khi nào dòng chảy và khi nào thì không?
void Main()
{
SynchronizationContext.SetSynchronizationContext(new FooContext());
Action a =() =>
{
var current = SynchronizationContext.Current;
//current is null here
};
a.BeginInvoke(null,null);
...sleep
Nếu tôi thực thi nội dung trên nhóm chủ đề, tôi có phải gán ngữ cảnh đồng bộ cho chủ đề cụ thể hiện đang thực thi tác phẩm của mình không?
Hãy xem bài viết này http://msdn.microsoft.com/en-us/magazine/gg598924.aspx. Nhưng một vấn đề là mã khác có thể chọn để ngăn chặn SynchronisationContext được "chảy" bằng cách gọi '.ConfigureAwait (false)'. Thật vậy đó là thực hành tốt nhất cho các thư viện không phải UI để làm điều này, vì chúng ** không ** quan tâm rằng nếu 'await' hồ sơ trên cùng một luồng được bắt đầu. –
Đó là một câu hỏi không thể tin được. Chỉ có cách bạn sẽ nhận được một nơi nào đó với điều này là unwearning rằng một phương thức BeginInvoke() của delegate có * bất cứ điều gì * để làm với SynchronizationContext."BeginInvoke" chỉ là một tên chung cho "chạy mã không đồng bộ". SynchronizationContext chỉ có một cái gì đó để làm với việc phải giải quyết các loại vấn đề bạn chạy vào khi bạn làm điều đó. –
Có thể trả lời giải thích tại sao nó quá rộng? Rất nhiều tài liệu trên mạng làm cho người ta tin rằng bối cảnh đồng bộ hóa sẽ chạy với bối cảnh thực thi giữa các hoạt động không đồng bộ. như trong ví dụ trên, luồng ngữ cảnh logic gọi nhưng không phải bối cảnh đồng bộ hóa. bất kỳ gợi ý nào về lý do tại sao đây là trường hợp thú vị. –