我想弄清楚如何確保該事件在讓其餘的代碼運行之前觸發。如何等待,直到一個事件完成,而不阻止在UI中執行
我掛鉤的事件是這樣的:
public static class ServiceUrlQueryParameters
{
public static void ServiceUrlQueryParameters()
{
...
dynamicMapServiceLayer.Initialized += new EventHandler<EventArgs>(DynamicMapServiceLayerQuery_Initialized);
...
}
}
所以,現在,該代碼連接監聽器的事件,並會等到事件觸發。但是,除非該事件已經解決,否則我不希望該類中的其他任何事情發生,因爲該地圖服務層初始化會設置下一行代碼所需的信息。不過,應用程序其餘部分和GUI中的代碼應該繼續運行。
我曾經有這樣的事件處理監聽器方法的代碼的其餘部分。
private void DynamicMapServiceLayer_Initialized(object sender, System.EventArgs evArgs)
{
Query query = GetParameterQuery();
QueryTask queryTask = new QueryTask(GetRestURL(dynMapServLayer));
queryTask.ExecuteCompleted += GraphicQueryTask_ExecuteCompleted;
...
queryTask.ExecuteAsync(query);
}
但這沒有意義,因爲執行查詢語義上與服務層初始化不相關。 將查詢代碼放入初始化地圖圖層時運行的事件處理程序方法對我來說似乎不合邏輯。 所以,現在我有這樣的:
public static class ServiceUrlQueryParameters
{
public static void ServiceUrlQueryParameters()
{
// No more Initialized event hookup to any event handling listener
}
public static void QueryUrlParameters()
{
if (! dynMapServLayer.IsInitialized)
{
return;
}
Query query = GetParameterQuery();
QueryTask queryTask = new QueryTask(GetRestURL(dynMapServLayer));
queryTask.ExecuteCompleted += GraphicQueryTask_ExecuteCompleted;
queryTask.Failed += QueryTask_Failed;
queryTask.ExecuteAsync(query);
}
}
但是,這不是一個好主意,因爲當QueryUrlParameters被調用時,初始化事件仍可能沒有解僱(也許它永遠不會)。
代碼不**在UI中隨機運行。如果你不想做某件事,因爲你的程序沒有準備好,那麼讓用戶明白。 *永遠不要*只是忽略一個請求,對於一個用戶無奈地敲打鼠標按鈕而言,沒有什麼好看的。禁用輸入,顯示一個漂亮的圖片。 –