我的课做了以下(简化)工作:
public void Startup(Action myAction)
{
_myAction = myAction;
}
private void EstablishApplicationEndpoint()
{
...
ApplicationEndpoint.BeginEstablish(OnApplicationEndpointEstablishCompleted, null);
}
private void OnApplicationEndpointEstablishCompleted(IAsyncResult result)
{
try
{
...
_myAction();
}
catch (Exception exception)
{
Console.WriteLine(exception);
}
}BeginEstablish方法将AsyncCallback作为第一个参数。
但是,myAction从未被执行过(我使用控制台应用程序中的类)。操作应该输出一些东西到控制台并读取一行,但是控制台会立即关闭。
我的控制台应用程序:
static void Main(string[] args)
{
StartPlatform();
}
private static void StartPlatform()
{
...
_platformController.Startup(SendContext);
}
private static void SendContext()
{
Console.WriteLine("Press ENTER to send context");
Console.ReadLine();
...
}由于控制台无法知道某个时候会出现ReadLine调用,所以它会自动关闭。我怎样才能防止这样做呢?
发布于 2015-11-17 10:24:34
您使用的是“异步编程模型”模式:https://msdn.microsoft.com/en-us/library/ms228963(v=vs.110).aspx
该模型的特点是使用了Begin和End方法。
请注意,当调用Begin方法(如您的BeginEstablish)时,回调方法所表示的工作将在单独的(背景)线程上进行,程序控件将立即在主线程中返回。
假设其他计算可以发生在主线程上,在某个时候回调将在后台线程上完成,然后后台线程的结果将被重新连接到主线程。
重新连接的机制是对相应的End方法的调用(在您的情况下,是对EndEstablish的调用)。因此,为了防止控制台应用程序由于从调用BeginEstablish中立即返回控制而退出,需要执行以下操作:
IAsyncResult调用返回的Begin对象的引用Begin之后的代码路径中的某个点,调用相应的End,传入从调用Begin获得的IAsyncResult对象Begin调用的第二个参数来管理状态。这看起来可能是:
private IAsyncResult EstablishApplicationEndpoint()
{
...
return ApplicationEndpoint.BeginEstablish(OnApplicationEndpointEstablishCompleted, null);
}..。
private static void StartPlatform()
{
...
_platformController.Startup(SendContext);
var asyncResult = _platformController.EstablishApplicationEndpoint();
// Do other things
// Re-join the callback
ApplicationEndpoint.EndEstablish(asyncResult);
}请记住,如果在调用End时回调尚未完成,End将在该点块上等待回调完成。
因为您的回调是与控制台交互的,所以我怀疑这将意味着在您的情况下对End的调用将被阻塞。
https://stackoverflow.com/questions/33753659
复制相似问题