none
c++/cx task相关 RRS feed

  • 问题

  • 如果一个自定义函数中存在异步操作

    如何获取这个函数操作完成的信息

    或者如何让这个自定义函数与之后的操作”有序“的运行

    假设自定义函数如下:

    void CImap::ConnectServer()
    {

     task<void> (ImapClient->ConnectAsync(hostname,port)).then([this] (task<void> pretask)
     {
      try{
       pretask.get();

       dr=ref new DataReader(ImapClient->InputStream);
       dr->InputStreamOptions=InputStreamOptions::Partial;
       ReceiveSend(dr,ImapClient);
      }
      catch (Exception^ ex)
       {
        ;
       }
     });
    }

    在其他文件中调用:

    void test()
    {
     
     CImap^ te=ref new CImap();
    te->ConnectServer(); //如果我在接下里区域还有一些操作要在ConnectServer结束后再运行,应该如何实现

     ***************************

     **************************

    }

    2012年8月30日 8:36

答案

  • 那么你就应该也把这个 ConnectServer 设计为异步的。

    IAsyncAction^ CImap::ConnectServerAsync()
    {
      return create_async([this] {
        task<void> (ImapClient->ConnectAsync(hostname,port)).then([this] (task<void> pretask)
        {
          try{
            pretask.get();
            dr=ref new DataReader(ImapClient->InputStream);
            dr->InputStreamOptions=InputStreamOptions::Partial;
            ReceiveSend(dr,ImapClient);
          }
          catch (Exception^ ex)
          {...}
        });
      });
    }

    然后调用的时候,用async方式

    task<void> (te->ConnectServerAsync()).then([this] {
        // Do the work after completing the async invoke
    });


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    • 已标记为答案 winstead 2012年8月31日 7:13
    2012年8月31日 6:15
    版主

全部回复

  • 那么你就应该也把这个 ConnectServer 设计为异步的。

    IAsyncAction^ CImap::ConnectServerAsync()
    {
      return create_async([this] {
        task<void> (ImapClient->ConnectAsync(hostname,port)).then([this] (task<void> pretask)
        {
          try{
            pretask.get();
            dr=ref new DataReader(ImapClient->InputStream);
            dr->InputStreamOptions=InputStreamOptions::Partial;
            ReceiveSend(dr,ImapClient);
          }
          catch (Exception^ ex)
          {...}
        });
      });
    }

    然后调用的时候,用async方式

    task<void> (te->ConnectServerAsync()).then([this] {
        // Do the work after completing the async invoke
    });


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    • 已标记为答案 winstead 2012年8月31日 7:13
    2012年8月31日 6:15
    版主
  • 谢谢你,bob。

    我还有一个疑问。

    IAsyncAction应该是没有返回值没有进度报告的异步操作

    可是我按照上述代码更改声明后,IDE提示我函数必须返回值。

    这是为什么呢。

    2012年8月31日 7:34
  • 是 StreamSocket 对吧,没有问题啊,并不会报告必须返回值。

    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年8月31日 8:11
    版主
  • 确实。

    是我编码上引起的谬误。

    2012年8月31日 8:27
  • hi,bob

    我有一个新的疑问,

    现在存在两个自定义函数

    IAsyncAction^ CImap::ConnectServer()
    {
     return create_async([this] {
     task<void> (ImapClient->ConnectAsync(hostname,port)).then([this] (task<void> Connectask)
     {
      try{
       Connectask.get();

       dr=ref new DataReader(ImapClient->InputStream);
       dr->InputStreamOptions=InputStreamOptions::Partial;
      
      }
      catch (Exception^ ex)
       {
        ;
       }
       });
     });
     
    }

    IAsyncAction^ CImap::ReceiveSend(DataReader^ reader,StreamSocket^ socket)
    {
     return create_async([this,reader,socket] {
      task<unsigned int>(reader->LoadAsync(512)).then([this,reader] (unsigned int size)
     {

      String^ resule;
      test=reader->ReadString(dr->UnconsumedBufferLength);
      resule=test;

       });
     });

    }

    我在另一个文件中调用他们

     task<void> (te->ConnectServer()).then([te,&result]{
      te->ReceiveSend(te->dr,te->ImapClient);
      result=te->test;
     });

    这样应该是ConnectServer完成后才进行ReceiveSend,对么

    可是当代码运行到

    task<unsigned int>(reader->LoadAsync(512)).then([this,reader] (unsigned int size)

    时就会报错,错误很可能是因为Connect没有完成而导致reader接收不到数据引起的

    这是为什么呢

    2012年9月3日 2:07
  •  你的ReceiveSend也是异步的,所以也使用task.then()方式。

    具体错误是什么?


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年9月3日 9:27
    版主
  • 之前有遇到过

    connect结束后,服务器会返回一个消息

    所以receivesend可以收到,如果还没connect结束就进行receivesend

    这时候reader收不到任何消息,进行loadasync会报错

    2012年9月3日 9:51