2010-09-21 60 views
37

我一直在試圖遵循一些WCF數據服務的實例並具有以下代碼:調度BeginInvoke的語法

private void OnSaveCompleted(IAsyncResult result) 
    { 
     Dispatcher.BeginInvoke(() => 
     { 
      context.EndSaveChanges(result); 
     }); 
    } 

這是由所謂的以下內容:

this.context.BeginSaveChanges(SaveChangesOptions.Batch, this.OnSaveCompleted, null); 

現在我開始有點困惑在這裏。首先,第一位代碼顯示語法錯誤「參數類型lambda表達式不能分配給參數類型System.Delegate」。因此,我不是盲目地試圖遵循示例代碼,而是試圖瞭解這裏發生了什麼。不幸的是,我正在努力理解錯誤以及實際發生的事情。

我覺得有點愚蠢,因爲我確信這很容易。

在此先感謝您的任何啓示!

回答

79

問題是,編譯器不知道你試圖將lambda表達式轉換爲什麼樣的委託。您可以修復,要麼有一個演員,或者一個獨立的變量:

private void OnSaveCompleted(IAsyncResult result) 
{   
    Dispatcher.BeginInvoke((Action) (() => 
    { 
     context.EndSaveChanges(result); 
    })); 
} 

private void OnSaveCompleted(IAsyncResult result) 
{ 
    Action action =() => 
    { 
     context.EndSaveChanges(result); 
    }; 
    Dispatcher.BeginInvoke(action); 
} 
+1

謝謝,但現在我我正在獲取「靜態角色中無法訪問非靜態方法'BeginInvoke' XT。我現在更困惑,因爲這不是一個靜態的方法? – 2010-09-21 13:51:45

+1

@Jon:它認爲你正在嘗試使用BeginInvoke作爲Dispatcher類的靜態方法 - 而你想使用Dispatcher *屬性*,然後在相關實例上調用BeginInvoke。我的猜測是,這不是在具有Dispatcher屬性的適當類中。剛剛看到這是WCF,我不確定從哪裏得到Dispatcher。我更習慣於從WPF和Silverlight中使用它。 – 2010-09-21 14:05:56

+1

這實際上在WPF應用程序的ViewModel類中 – 2010-09-21 14:16:44

7

由喬恩飛碟雙向的答案是非常好的,但也有其他的可能性。我更喜歡「開始調用新的行動」,這對我來說很容易閱讀和記憶。

private void OnSaveCompleted(IAsyncResult result) 
{  
    Dispatcher.BeginInvoke(new Action(() => 
    { 
     context.EndSaveChanges(result); 
    })); 
} 

private void OnSaveCompleted(IAsyncResult result) 
{  
    Dispatcher.BeginInvoke(new Action(delegate 
    { 
     context.EndSaveChanges(result); 
    })); 
} 

private void OnSaveCompleted(IAsyncResult result) 
{  
    Dispatcher.BeginInvoke(new Action(() => context.EndSaveChanges(result))); 
} 
+0

與剛做(動作)投射相比,執行「新動作」可能花費更多? – 2015-09-05 21:20:50

0

如果你的方法不需要參數,這是我發現的最短的版本:

Application.Current.Dispatcher.BeginInvoke((Action)MethodName);