2012-08-09 35 views
0

我正在Metro模式下實現線程,我在Google搜索時得到了這個例子,但我不明白CallbackContext。這有什麼用? This解釋了它在MTA中的使用,但對我不明白。當我使用CallbackContext作爲AnySame時,我正面臨問題。有些東西可以和其他東西配合使用,但不能與其他東西配合所以首先我想知道這有什麼用?! PS:我是WindowsRT編程和C++的新手!謝謝!委託和線程:CallbackContext參數

auto workItemHandler = ref new WorkItemHandler([=](IAsyncAction^) 
{ 
    // Run the user callback. 
    try 
    { 
     func(data); 
    } 
    catch (...) 
    { 

    } 
    // Signal that the thread has completed. 
    SetEvent(completionEvent); 
    //CloseHandle(completionEvent); 

}, CallbackContext::Same); 

回答

2

CallbackContext確定是否您的代理(在這種情況下,一個WorkItemHandler)聚集自由線程編組。這將決定您的代表是否可以走私到另一間公寓(CallbackContext::Any),或者是否必須將其退回至始發公寓(CallbackContext::Same)。基本上,它告訴調用你的代理的人是否可以直接調用它,而不管它是否是公寓,或者如果他們需要回到它創建的公寓中。

例如,在Windows應用商店應用中,任何修改UI需要在UI線程(STA)上運行。讓我們假設你所在的方法是在UI線程上運行的方法(比如事件回調,就像按鈕點擊處理程序一樣)。某些異步調用如ThreadPool::RunAsync將在線程其他上運行傳入的委託,而不是UI線程(因爲委託的默認值爲CallbackContext::Any)。如果您不需要在UI線程上執行任何操作,這將非常有用,因爲它可以釋放該線程以繼續提取消息(並且您的應用程序會繼續保持高性能)。

但是,如果您確實需要修改UI或向UI進行回調,並且您嘗試從非UI線程執行此操作,則會得到不正確的線程異常。通過添加參數CallbackContext::Same,您可以強制委託在原始單元(在此場景中爲STA)中運行,從而避免此問題。

(您也可以使用Dispatcher->RunAsync調用進一步的委託在STA上運行,是否讓整個委託在STA上運行更好,這取決於您的場景。)