首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在AsyncCallback中使用操作

在AsyncCallback中使用操作
EN

Stack Overflow用户
提问于 2015-11-17 09:46:04
回答 1查看 354关注 0票数 1

我的课做了以下(简化)工作:

代码语言:javascript
复制
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从未被执行过(我使用控制台应用程序中的类)。操作应该输出一些东西到控制台并读取一行,但是控制台会立即关闭。

我的控制台应用程序:

代码语言:javascript
复制
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调用,所以它会自动关闭。我怎样才能防止这样做呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-17 10:24:34

您使用的是“异步编程模型”模式:https://msdn.microsoft.com/en-us/library/ms228963(v=vs.110).aspx

该模型的特点是使用了BeginEnd方法。

请注意,当调用Begin方法(如您的BeginEstablish)时,回调方法所表示的工作将在单独的(背景)线程上进行,程序控件将立即在主线程中返回。

假设其他计算可以发生在主线程上,在某个时候回调将在后台线程上完成,然后后台线程的结果将被重新连接到主线程。

重新连接的机制是对相应的End方法的调用(在您的情况下,是对EndEstablish的调用)。因此,为了防止控制台应用程序由于从调用BeginEstablish中立即返回控制而退出,需要执行以下操作:

  • 维护对从IAsyncResult调用返回的Begin对象的引用
  • 在调用Begin之后的代码路径中的某个点,调用相应的End,传入从调用Begin获得的IAsyncResult对象
  • 可以选择使用Begin调用的第二个参数来管理状态。

这看起来可能是:

代码语言:javascript
复制
private IAsyncResult EstablishApplicationEndpoint()
{
    ...
    return ApplicationEndpoint.BeginEstablish(OnApplicationEndpointEstablishCompleted, null);
}

..。

代码语言:javascript
复制
private static void StartPlatform()
{
    ...
    _platformController.Startup(SendContext);
    var asyncResult = _platformController.EstablishApplicationEndpoint();

    // Do other things

    // Re-join the callback
    ApplicationEndpoint.EndEstablish(asyncResult);
}

请记住,如果在调用End时回调尚未完成,End将在该点块上等待回调完成。

因为您的回调是与控制台交互的,所以我怀疑这将意味着在您的情况下对End的调用将被阻塞。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33753659

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档