我想弄清楚如何确保该事件在让其余的代码运行之前触发。如何等待,直到一个事件完成,而不阻止在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中随机运行。如果你不想做某件事,因为你的程序没有准备好,那么让用户明白。 *永远不要*只是忽略一个请求,对于一个用户无奈地敲打鼠标按钮而言,没有什么好看的。禁用输入,显示一个漂亮的图片。 –