我试图弄清楚如何在让其余代码运行之前确保事件已触发。
我连接了这样一个事件:
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 时,Initialized 事件可能仍然没有触发(也许永远不会触发)。