How to wait for an external response with callbacks?
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
|
show 2 more comments
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
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
|
show 2 more comments
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
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
c# sockets asynchronous networking
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
|
show 2 more comments
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
|
show 2 more comments
1 Answer
1
active
oldest
votes
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).
add a comment |
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
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
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).
add a comment |
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).
add a comment |
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).
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).
answered Nov 20 at 7:38
Dennis19901
533
533
add a comment |
add a comment |
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.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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
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