How to wait for an external response with callbacks?










0














I've been searching quite a bit on this topic, but I think I'm not using the right words for searching any of this stuff, because I've not found an answer yet.



I'm looking for a way to make a process wait for a (specific) response of an external source.



In more detail, in a standard socket connection, I ask my remote endpoint for a certain value via a socket.send, how can I "catch" their reply? The idea that I already had was to send some sort of identifier along to determine what request this belongs to.



Is there a way to efficiently achieve this? (Performance is rather important). I'm currently using .NET2.0 if that's relevant information.



Some example code:



 public void AskForReply()

//Send to connected endpoint


public void ReceiveReply(IAsyncResult response)

//Do stuff with the response



I've been working out several ideas in my head. But they all feel really messy and not very efficient. Is there a design pattern for this? Are there standards for this behavior?



And help is greatly appreciated!










share|improve this question





















  • You mean something like this didn't work?
    – yazanpro
    Nov 10 at 3:13











  • Why is .net 2 a requirement, this is not supported and very out of date, no operating systems support this version of .net anymore
    – TheGeneral
    Nov 10 at 3:20











  • Also why are you using sockets and not a more mature technology, It takes a lot of boiler plating to make a socket solution work correctly and build a messaging system on top of it, why not just use something like WCF
    – TheGeneral
    Nov 10 at 3:22











  • @TheGeneral Started because Unity at least supported .Net2.0. I'm not going to use a more "mature technology" because I don't want all the unnecessary overhead. I also want full control myself. WCF is not performant at all compared to sockets for example.
    – Dennis19901
    Nov 11 at 0:07










  • @yazanpro Your example lists asynchronous operations on 1 socket instance. It, in no way, waits for external communication for a callback, which is what I'm looking for.
    – Dennis19901
    Nov 11 at 0:09















0














I've been searching quite a bit on this topic, but I think I'm not using the right words for searching any of this stuff, because I've not found an answer yet.



I'm looking for a way to make a process wait for a (specific) response of an external source.



In more detail, in a standard socket connection, I ask my remote endpoint for a certain value via a socket.send, how can I "catch" their reply? The idea that I already had was to send some sort of identifier along to determine what request this belongs to.



Is there a way to efficiently achieve this? (Performance is rather important). I'm currently using .NET2.0 if that's relevant information.



Some example code:



 public void AskForReply()

//Send to connected endpoint


public void ReceiveReply(IAsyncResult response)

//Do stuff with the response



I've been working out several ideas in my head. But they all feel really messy and not very efficient. Is there a design pattern for this? Are there standards for this behavior?



And help is greatly appreciated!










share|improve this question





















  • You mean something like this didn't work?
    – yazanpro
    Nov 10 at 3:13











  • Why is .net 2 a requirement, this is not supported and very out of date, no operating systems support this version of .net anymore
    – TheGeneral
    Nov 10 at 3:20











  • Also why are you using sockets and not a more mature technology, It takes a lot of boiler plating to make a socket solution work correctly and build a messaging system on top of it, why not just use something like WCF
    – TheGeneral
    Nov 10 at 3:22











  • @TheGeneral Started because Unity at least supported .Net2.0. I'm not going to use a more "mature technology" because I don't want all the unnecessary overhead. I also want full control myself. WCF is not performant at all compared to sockets for example.
    – Dennis19901
    Nov 11 at 0:07










  • @yazanpro Your example lists asynchronous operations on 1 socket instance. It, in no way, waits for external communication for a callback, which is what I'm looking for.
    – Dennis19901
    Nov 11 at 0:09













0












0








0







I've been searching quite a bit on this topic, but I think I'm not using the right words for searching any of this stuff, because I've not found an answer yet.



I'm looking for a way to make a process wait for a (specific) response of an external source.



In more detail, in a standard socket connection, I ask my remote endpoint for a certain value via a socket.send, how can I "catch" their reply? The idea that I already had was to send some sort of identifier along to determine what request this belongs to.



Is there a way to efficiently achieve this? (Performance is rather important). I'm currently using .NET2.0 if that's relevant information.



Some example code:



 public void AskForReply()

//Send to connected endpoint


public void ReceiveReply(IAsyncResult response)

//Do stuff with the response



I've been working out several ideas in my head. But they all feel really messy and not very efficient. Is there a design pattern for this? Are there standards for this behavior?



And help is greatly appreciated!










share|improve this question













I've been searching quite a bit on this topic, but I think I'm not using the right words for searching any of this stuff, because I've not found an answer yet.



I'm looking for a way to make a process wait for a (specific) response of an external source.



In more detail, in a standard socket connection, I ask my remote endpoint for a certain value via a socket.send, how can I "catch" their reply? The idea that I already had was to send some sort of identifier along to determine what request this belongs to.



Is there a way to efficiently achieve this? (Performance is rather important). I'm currently using .NET2.0 if that's relevant information.



Some example code:



 public void AskForReply()

//Send to connected endpoint


public void ReceiveReply(IAsyncResult response)

//Do stuff with the response



I've been working out several ideas in my head. But they all feel really messy and not very efficient. Is there a design pattern for this? Are there standards for this behavior?



And help is greatly appreciated!







c# sockets asynchronous networking






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Nov 10 at 2:44









Dennis19901

533




533











  • You mean something like this didn't work?
    – yazanpro
    Nov 10 at 3:13











  • Why is .net 2 a requirement, this is not supported and very out of date, no operating systems support this version of .net anymore
    – TheGeneral
    Nov 10 at 3:20











  • Also why are you using sockets and not a more mature technology, It takes a lot of boiler plating to make a socket solution work correctly and build a messaging system on top of it, why not just use something like WCF
    – TheGeneral
    Nov 10 at 3:22











  • @TheGeneral Started because Unity at least supported .Net2.0. I'm not going to use a more "mature technology" because I don't want all the unnecessary overhead. I also want full control myself. WCF is not performant at all compared to sockets for example.
    – Dennis19901
    Nov 11 at 0:07










  • @yazanpro Your example lists asynchronous operations on 1 socket instance. It, in no way, waits for external communication for a callback, which is what I'm looking for.
    – Dennis19901
    Nov 11 at 0:09
















  • You mean something like this didn't work?
    – yazanpro
    Nov 10 at 3:13











  • Why is .net 2 a requirement, this is not supported and very out of date, no operating systems support this version of .net anymore
    – TheGeneral
    Nov 10 at 3:20











  • Also why are you using sockets and not a more mature technology, It takes a lot of boiler plating to make a socket solution work correctly and build a messaging system on top of it, why not just use something like WCF
    – TheGeneral
    Nov 10 at 3:22











  • @TheGeneral Started because Unity at least supported .Net2.0. I'm not going to use a more "mature technology" because I don't want all the unnecessary overhead. I also want full control myself. WCF is not performant at all compared to sockets for example.
    – Dennis19901
    Nov 11 at 0:07










  • @yazanpro Your example lists asynchronous operations on 1 socket instance. It, in no way, waits for external communication for a callback, which is what I'm looking for.
    – Dennis19901
    Nov 11 at 0:09















You mean something like this didn't work?
– yazanpro
Nov 10 at 3:13





You mean something like this didn't work?
– yazanpro
Nov 10 at 3:13













Why is .net 2 a requirement, this is not supported and very out of date, no operating systems support this version of .net anymore
– TheGeneral
Nov 10 at 3:20





Why is .net 2 a requirement, this is not supported and very out of date, no operating systems support this version of .net anymore
– TheGeneral
Nov 10 at 3:20













Also why are you using sockets and not a more mature technology, It takes a lot of boiler plating to make a socket solution work correctly and build a messaging system on top of it, why not just use something like WCF
– TheGeneral
Nov 10 at 3:22





Also why are you using sockets and not a more mature technology, It takes a lot of boiler plating to make a socket solution work correctly and build a messaging system on top of it, why not just use something like WCF
– TheGeneral
Nov 10 at 3:22













@TheGeneral Started because Unity at least supported .Net2.0. I'm not going to use a more "mature technology" because I don't want all the unnecessary overhead. I also want full control myself. WCF is not performant at all compared to sockets for example.
– Dennis19901
Nov 11 at 0:07




@TheGeneral Started because Unity at least supported .Net2.0. I'm not going to use a more "mature technology" because I don't want all the unnecessary overhead. I also want full control myself. WCF is not performant at all compared to sockets for example.
– Dennis19901
Nov 11 at 0:07












@yazanpro Your example lists asynchronous operations on 1 socket instance. It, in no way, waits for external communication for a callback, which is what I'm looking for.
– Dennis19901
Nov 11 at 0:09




@yazanpro Your example lists asynchronous operations on 1 socket instance. It, in no way, waits for external communication for a callback, which is what I'm looking for.
– Dennis19901
Nov 11 at 0:09












1 Answer
1






active

oldest

votes


















1














For anyone who runs into a similar problem, I have found a way to make an asynchronous call synchronous (which is essentially what you are trying to achieve).



 EventWaitHandle waitHandler;
string replyMessage;

void string AskForReply()

//Already requesting something...
if(waitHandler != null) return;
waitHandler = new EventWaitHandle(false, EventResetMode.AutoReset);

//Send a request to a remote service

waitHandler.WaitOne(timeout);

//Will reply null (or the default value) if the timeout passes.
return replyMessage;


void ReceiveReply(string message)

//We never asked for a reply? (Optional)
if (waitHandler != null) return;
replyMessage = message;
//Process your reply

waitHandler.Set();
waitHandler = null;



It's probably a good idea to put the EventWaitHandle and the reply message in a class for better and cleaner management. You can then even put this object in a dictionary along with a key that you can use handle multiple requests at once (do keep in mind they are synchronous and will block your thread until the timeout or the waithandle is set).






share|improve this answer




















    Your Answer






    StackExchange.ifUsing("editor", function ()
    StackExchange.using("externalEditor", function ()
    StackExchange.using("snippets", function ()
    StackExchange.snippets.init();
    );
    );
    , "code-snippets");

    StackExchange.ready(function()
    var channelOptions =
    tags: "".split(" "),
    id: "1"
    ;
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function()
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled)
    StackExchange.using("snippets", function()
    createEditor();
    );

    else
    createEditor();

    );

    function createEditor()
    StackExchange.prepareEditor(
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader:
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    ,
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    );



    );













    draft saved

    draft discarded


















    StackExchange.ready(
    function ()
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53235590%2fhow-to-wait-for-an-external-response-with-callbacks%23new-answer', 'question_page');

    );

    Post as a guest















    Required, but never shown

























    1 Answer
    1






    active

    oldest

    votes








    1 Answer
    1






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    1














    For anyone who runs into a similar problem, I have found a way to make an asynchronous call synchronous (which is essentially what you are trying to achieve).



     EventWaitHandle waitHandler;
    string replyMessage;

    void string AskForReply()

    //Already requesting something...
    if(waitHandler != null) return;
    waitHandler = new EventWaitHandle(false, EventResetMode.AutoReset);

    //Send a request to a remote service

    waitHandler.WaitOne(timeout);

    //Will reply null (or the default value) if the timeout passes.
    return replyMessage;


    void ReceiveReply(string message)

    //We never asked for a reply? (Optional)
    if (waitHandler != null) return;
    replyMessage = message;
    //Process your reply

    waitHandler.Set();
    waitHandler = null;



    It's probably a good idea to put the EventWaitHandle and the reply message in a class for better and cleaner management. You can then even put this object in a dictionary along with a key that you can use handle multiple requests at once (do keep in mind they are synchronous and will block your thread until the timeout or the waithandle is set).






    share|improve this answer

























      1














      For anyone who runs into a similar problem, I have found a way to make an asynchronous call synchronous (which is essentially what you are trying to achieve).



       EventWaitHandle waitHandler;
      string replyMessage;

      void string AskForReply()

      //Already requesting something...
      if(waitHandler != null) return;
      waitHandler = new EventWaitHandle(false, EventResetMode.AutoReset);

      //Send a request to a remote service

      waitHandler.WaitOne(timeout);

      //Will reply null (or the default value) if the timeout passes.
      return replyMessage;


      void ReceiveReply(string message)

      //We never asked for a reply? (Optional)
      if (waitHandler != null) return;
      replyMessage = message;
      //Process your reply

      waitHandler.Set();
      waitHandler = null;



      It's probably a good idea to put the EventWaitHandle and the reply message in a class for better and cleaner management. You can then even put this object in a dictionary along with a key that you can use handle multiple requests at once (do keep in mind they are synchronous and will block your thread until the timeout or the waithandle is set).






      share|improve this answer























        1












        1








        1






        For anyone who runs into a similar problem, I have found a way to make an asynchronous call synchronous (which is essentially what you are trying to achieve).



         EventWaitHandle waitHandler;
        string replyMessage;

        void string AskForReply()

        //Already requesting something...
        if(waitHandler != null) return;
        waitHandler = new EventWaitHandle(false, EventResetMode.AutoReset);

        //Send a request to a remote service

        waitHandler.WaitOne(timeout);

        //Will reply null (or the default value) if the timeout passes.
        return replyMessage;


        void ReceiveReply(string message)

        //We never asked for a reply? (Optional)
        if (waitHandler != null) return;
        replyMessage = message;
        //Process your reply

        waitHandler.Set();
        waitHandler = null;



        It's probably a good idea to put the EventWaitHandle and the reply message in a class for better and cleaner management. You can then even put this object in a dictionary along with a key that you can use handle multiple requests at once (do keep in mind they are synchronous and will block your thread until the timeout or the waithandle is set).






        share|improve this answer












        For anyone who runs into a similar problem, I have found a way to make an asynchronous call synchronous (which is essentially what you are trying to achieve).



         EventWaitHandle waitHandler;
        string replyMessage;

        void string AskForReply()

        //Already requesting something...
        if(waitHandler != null) return;
        waitHandler = new EventWaitHandle(false, EventResetMode.AutoReset);

        //Send a request to a remote service

        waitHandler.WaitOne(timeout);

        //Will reply null (or the default value) if the timeout passes.
        return replyMessage;


        void ReceiveReply(string message)

        //We never asked for a reply? (Optional)
        if (waitHandler != null) return;
        replyMessage = message;
        //Process your reply

        waitHandler.Set();
        waitHandler = null;



        It's probably a good idea to put the EventWaitHandle and the reply message in a class for better and cleaner management. You can then even put this object in a dictionary along with a key that you can use handle multiple requests at once (do keep in mind they are synchronous and will block your thread until the timeout or the waithandle is set).







        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered Nov 20 at 7:38









        Dennis19901

        533




        533



























            draft saved

            draft discarded
















































            Thanks for contributing an answer to Stack Overflow!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid


            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.

            To learn more, see our tips on writing great answers.





            Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


            Please pay close attention to the following guidance:


            • Please be sure to answer the question. Provide details and share your research!

            But avoid


            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.

            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function ()
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53235590%2fhow-to-wait-for-an-external-response-with-callbacks%23new-answer', 'question_page');

            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            𛂒𛀶,𛀽𛀑𛂀𛃧𛂓𛀙𛃆𛃑𛃷𛂟𛁡𛀢𛀟𛁤𛂽𛁕𛁪𛂟𛂯,𛁞𛂧𛀴𛁄𛁠𛁼𛂿𛀤 𛂘,𛁺𛂾𛃭𛃭𛃵𛀺,𛂣𛃍𛂖𛃶 𛀸𛃀𛂖𛁶𛁏𛁚 𛂢𛂞 𛁰𛂆𛀔,𛁸𛀽𛁓𛃋𛂇𛃧𛀧𛃣𛂐𛃇,𛂂𛃻𛃲𛁬𛃞𛀧𛃃𛀅 𛂭𛁠𛁡𛃇𛀷𛃓𛁥,𛁙𛁘𛁞𛃸𛁸𛃣𛁜,𛂛,𛃿,𛁯𛂘𛂌𛃛𛁱𛃌𛂈𛂇 𛁊𛃲,𛀕𛃴𛀜 𛀶𛂆𛀶𛃟𛂉𛀣,𛂐𛁞𛁾 𛁷𛂑𛁳𛂯𛀬𛃅,𛃶𛁼

            Edmonton

            Crossroads (UK TV series)