2009-11-11 84 views
0

對於從silverlight 3調用wcf服務並更新單獨線程中的ui的場景中的事件排序,我有一個問題。基本上,我想知道我在做什麼是正確的...示例如下。這是我在這裏的第一篇文章,請耐心等待,因爲我不確定如何發佈實際代碼。示例如下:來自Silverlight 3的異步Web服務調用

//<summary> 
public static void Load(string userId) 
{ 

    //Build the request. 
    GetUserNameRequest request = 
    new GetUserNameRequest { UserId = userId }; 

    //Open the connection. 
    instance.serviceClient = ServiceController.UserService; 

    //Make the request. 
    instance.serviceClient.GetUserNameCompleted 
    += UserService_GetUserNameCompleted; 

    instance.serviceClient.GetGetUserNameAsync(request); 

    return instance.VM; 
} 

/// <summary> 
private static void UserService_GetUserNameCompleted(object sender, GetUserNameCompletedEventArgs e) 
{ 
    try 
    { 
    Controller.UIDispatcher.BeginInvoke(() => 
    { 
     //Load the response. 
     if (e.Result != null && e.Result.Success) 
     { 
     LoadResponse(e.Result); 
     } 

     //Completed loading data. 
    }); 
    } 
    finally 
    { 
    instance.serviceClient.GetUserNameCompleted 
     -= UserService_GetUserNameCompleted; 

    ServiceHelper.CloseService(instance.serviceClient); 
    } 
} 

所以我的問題主要是,我的UI線程內,當我加載的響應,如果拋出異常,將在「最後」塊明白了嗎?如果沒有,我應該在另一個try/catch裏面加載響應的lambda?

另外,因爲我在ui線程上執行加載,是否有可能在UI線程完成更新之前執行finally操作?並且可能因此在加載完成之前調用Servicehelper.CloseService()?

我問,因爲我使用這種方法有間歇性問題。

回答

0

finally塊應在之前執行處理BeginInvoke中的響應。 BeginInvoke意味着代碼將在下一個UI週期中執行。

通常,這種類型的最佳方法是將所需的所有數據從響應中提取出來並存儲在變量中,然後清理服務代碼。然後調用BeginInvoke並使用變量中的數據更新UI。