2011-07-15 33 views
5

Tôi đang cố gắng tạo luồng thứ hai với bộ điều phối để tôi có thể có bộ điều phối chính (cho giao diện người dùng) hoàn toàn không bị căng thẳng và có giao diện người dùng liên tục..NET Tạo Bộ điều phối mới

Bây giờ, tôi có thể tạo nhiều chủ đề cho mỗi phụ (hoặc void trong C#), nhưng không phải là tôi có thể tạo một chuỗi mới và lấy điều phối của nó, và gọi nó? Đây là những gì tôi đã thực hiện:

Private CheckLoopThread As New System.Threading.Thread(New System.Threading.ThreadStart(AddressOf CheckLoop)) 

CheckLoopThread.Priority = System.Threading.ThreadPriority.Lowest 
CheckLoopThread.Start() 
Dim Test As Windows.Threading.Dispatcher = Windows.Threading.Dispatcher.FromThread(CheckLoopThread) 

Tuy nhiên, biến "Kiểm tra" sau khi thực thi "Không có gì". Sao có thể như thế được? Có phải cách khác để tạo điều phối thứ hai không?

Câu trả lời được đánh giá cao ở mọi dạng .NET. Visual Basic hoặc C#. Tôi đang làm việc trong VB.NET WPF trên khuôn khổ .NET 4.0.

Xin cảm ơn trước.

+0

Hãy chắc chắn rằng CheckLoopThread không kết thúc ngay lập tức sau khi bắt đầu nó (nếu thread chạy một thủ tục CheckLoop mà không mất nhiều thời gian để thực hiện). –

+0

Vòng kiểm tra có một vòng lặp trong đó, nó không kết thúc. –

Trả lời

10

Dispatcher.FromThread sẽ không tạo Bộ điều phối và sẽ trả về giá trị rỗng, nếu Bộ điều phối chưa được tạo cho chuỗi. Để tạo Bộ điều phối cho một chuỗi, bạn sẽ phải truy cập Dispatcher.CurrentDispatcher ít nhất một lần trên số CheckLoopThread của mình. Như nó nói trên MSDN cho Dispatcher.CurrentDispatcher:

Nếu một điều phối không được liên kết với luồng hiện tại, Điều phối viên mới sẽ được tạo. Đây không phải là trường hợp với phương thức FromThread . FromThread sẽ trả về null nếu không có một điều phối liên quan đến các chủ đề quy định

+0

Cảm ơn bạn rất nhiều! Đó thực sự là nó. +1 cho bạn. –

5

Tôi đang thực sự tạo ra rất nhiều những điều vận, tôi đoán là cách đúng đắn là một cái gì đó dọc theo dòng sau đây:

object theLock = new object(); 
Dispatcher dispatcher = null; 

lock (theLock) 
{ 
    new Thread(new ThreadStart(() => 
    { 
     lock (theLock) 
     { 
      dispatcher = Dispatcher.CurrentDispatcher; 
      Monitor.Pulse(theLock); 
     } 
     Dispatcher.Run(); 
    })).Start(); 

    Monitor.Wait(theLock); 
} 

dispatcher.Invoke(...); 

Nó có vẻ phức tạp với tất cả các khóa, nhưng về mặt lý thuyết phương pháp Start() có thể trở lại trước khi dispatcher thực sự được thiết lập, do đó, một cuộc gọi đến nó có thể dẫn đến NullReferenceException mà không có khóa.

+0

Điều này đã làm cho tôi. Cảm ơn! – aclave1

7

Tại sao phải khóa?

tôi thích:

Dispatcher myDispatcher = null; 

ManualResetEvent dispatcherReadyEvent = new ManualResetEvent(false); 

new Thread(new ThreadStart(() => 
{ 
    myDispatcher = Dispatcher.CurrentDispatcher; 
    dispatcherReadyEvent.Set(); 
    Dispatcher.Run(); 
})).Start(); 

dispatcherReadyEvent.WaitOne(); 

myDispatcher.Invoke(...); 
+1

Rất đúng, mặc dù tôi không chắc liệu triển khai cơ bản có giống nhau hay không. – mycroes

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