c# - Mark task as completed -


i’m implementing client protocol myprotocol on tcp/ip. protocol’s connect() method should have signature similar of tcpclient.connectasync() – is, should return task:

task myprotocol.connect (…); 

this method (myprotocol.connect()) should make asynchronous tcp/ip connection (via tcpclient.connectasync()), return non-completed task t , periodically send message m server – again asynchronously (via networkstream.writeasync()). when response r received server – again asynchronously (via networkstream.readasync()), myprotocol.connect() should complete task t. i’m doing following:

    // client of protocol: var task = myprotocol.connect(); // asynchronous call, don’t want wait until connected task.continuewith(t => {     // connected – doing onconnected stuff     … });  // myprotocol.connect() implementation: public class myprotocol {     private task connecttask;     public task connect(…)     {         var tcpipconnecttask = mtcpipprotocol.connect(…);         tcpipconnecttask.continuewith(t =>         {             connecttask = new task();         }         return connecttask;     } } 

periodical sending of message m server has done through timer. once response r received server asynchronously, connecttask must marked completed, , don’t see ways of doing that. well, strictly speaking, have managed mark connecttask completed; i’m wrapping in taskcompletionsource<bool> , use taskcompletionsource.setresult(true). i’m wondering if only, let alone best way of accomplishing need? don’t fact taskcompletionsource<> has have non-void task result type (i used bool), i.e. there’s no non-generic version.

until tpl arrived, had our own similar framework , method task.notifycompleted(), create task in 1 place, , mark completed in place – working asynchronously. i’ve read tasks in tpl seems imply task completes if delegate runs last line… or missing simple?

since you're using .net 4.5, should use c# 5.0 async-await, meant kind of situations. code (somewhat pseudo-codish):

public task connectasync() {     await clientconnectasync();      while (true)     {         await sendmessageasync();          var response = await receivemessageasync();          if (response == r)             return;          await task.delay(period);     } } 

to answer questions:

however i’m wondering if only, let alone best way of accomplishing need?

if don't want use async-await, yes, taskcompletionsource general-purpose way of doing this.

i don’t fact taskcompletionsource<> has have non-void task result type (i used bool), i.e. there’s no non-generic version.

that annoying, doesn't matter, since task<t> inherits task.

but i’ve read tasks in tpl seems imply task completes if delegate runs last line […]

that's true tasks have delegate run (those can created using task.run(), task.factory.startnew() or new task()). doesn't apply tasks no delegate, can created using async-await or taskcompletionsource.


Comments

Popular posts from this blog

c++ - OpenCV Error: Assertion failed <scn == 3 ::scn == 4> in unknown function, -

php - render data via PDO::FETCH_FUNC vs loop -

The canvas has been tainted by cross-origin data in chrome only -