2010-11-24 33 views
4
private void GeoCode_Method1(string myaddress, int waypointIndex, string callingUser) 
{   
    GCService.GeocodeCompleted += new EventHandler<NSpace.GCService.GeocodeCompletedEventArgs>(GeoCode_Method1_GeocodeCompleted); 
    GCService.GeocodeAsync(request, waypointIndex); 
} 

void GeoCode_Method1_GeocodeCompleted(object sender, NSpace.GCService.GeocodeCompletedEventArgs e) 
{ 
    //***QUESTION: how do I access variable "callinguser" from GeoCode_Method1 in this method?? 
} 

當我打電話到GeoCode_Method1我在「callinguser」字符串變量發送,我想訪問這個在GeoCode_Method1_GeocodeCompleted(當異步GeoCodingAsync調用完成觸發)。我該怎麼做呢?傳遞的異步附加變量完成事件處理

回答

4

最簡單的方法是使用C#lambda表達式作爲事件處理函數。這個lambda表達式可以調用GeoCode_Method1_GeocodeCompleted方法並傳遞callinguser參數。

GCService.GeocodeCompleted += 
    (sender, e) => GeoCode_Method1_GeocodeCompleted(callinguser, sender, e); 
GCService.GeocodeAsync(request, waypointIndex); 

void GeoCode_Method1_GeocodeCompleted(
    string callingUser, 
    object sender, 
    Space.GCService.GeocodeCompletedEventArgs e) { 
    //***QUESTION: how do i access variable "callinguser" from GeoCode_Method1 in this method?? 
} 
+0

謝謝大家!現在明白了。 – Simba 2010-11-28 03:58:07

0

您應該創建一個lambda expression

private void GeoCode_Method1(string myaddress, int waypointIndex, string callingUser) 
{   
    GCService.GeocodeCompleted += (sender, e) => { 
     MessageBox.Show(callingUser); 
    }; 
    GCService.GeocodeAsync(request, waypointIndex); 
} 

Lambda表達式可以訪問所有的外部方法變量和參數。 (這被稱爲closure

lambda表達式的sendere參數是基於它被用作的委託類型隱含類型的。

1

理想的GCService將有處理,對你(應該如果正確遵守的異步事件模式)的方式,但如果它不存在使用C#閉包,雖然這是一個小的方式複雜。

你會這麼做,如下所示 - 在我的示例中,我已經展示瞭如何確保GeocodeCompleted事件處理程序在事件完成時取消訂閱。

private void GeoCode_Method1(string myaddress, int waypointIndex, string callingUser) 
{  
    // declare the eventHandler before assignment so that it's accessible in the 
    // lambda function  
    EventHandler<NSpace.GCService.GeocodeCompletedEventArgs> eventHandler = null; 
    eventHandler = (sender, eventArgs) => HandleGeocodeCompleted(sender, eventArgs, callingUser, eventHandler); 
    GCService.GeocodeCompleted += eventHandler; 
    GCService.GeocodeAsync(request, waypointIndex); 
} 

void HandleGeocodeCompleted(object sender, NSpace.GCService.GeocodeCompletedEventArgs e, string callingUser, EventHandler<NSpace.GCService.GeocodeCompletedEventArgs> eventHandler) 
{ 
    GCService.GeocodeCompleted -= eventHandler; 
    // use callingUser here 
} 
+0

因爲如果你不編譯器會在第6行給你一個錯誤,使用未分配的局部變量'eventHandler' – 2010-11-24 17:52:52