Synchronising data in C#
$begingroup$
We use a third party dll which has an object called CServer and was provided by one of our software vendors to act as an API between our applications and their applications.
CServer has the following method:
bool SynchroniseData()
which can be called if we want to fetch data from server which is very important for our application. This call signifies to the DLL our intention that we want to fetch the data. It does not fetch the data. Instead it returns true, if the request was successfully send to their application.
When data are actually fetched in the CServer
object, CServer
fires the event onDataFetched
. We listen to that event and process the data. The CServer
always has the latest data, since it continuously synchronises the data with our Vendor's servers.
However, there are many times at which the event onDataSynchronisationStopped
is called. This signifies that the CServer
object will stop data synchronisation with the server. This event is fired when the network is momentarily down, or if the server has some minor delays and so on.
We always want to have that data, and thus we try to fetch them again.
We currently do it like this:
private void OnDataFetchedHandler(object sender, EventArgs eventArgs){
try{
bool dataHaveBeenFetched;
do{
dataHaveBeenFetched = TrytoFetchData((CServer) sender);
Thread.Sleep(1000);
} while (!dataHaveBeenFetched);
}
catch (Exception ex){
Log.ErrorFormat(ex.Message, ex);
}
}
private bool TrytoFetchData(CServer sender){
sender.SynchroniseData();
ManualResetEvent manualResetEvent = new ManualResetEvent(false);
EventHandler manualResetEventSethandler = (s, e) => manualResetEvent.Set();
sender.OnDataFetched += manualResetEventSethandler;
bool dataHaveBeenFetched = manualResetEvent.WaitOne(new TimeSpan(0, 0, 3, 0));
sender.OnDataFetched -= manualResetEventSethandler;
return dataHaveBeenFetched;
}
Is there any cleaner way of doing this?
c#
$endgroup$
add a comment |
$begingroup$
We use a third party dll which has an object called CServer and was provided by one of our software vendors to act as an API between our applications and their applications.
CServer has the following method:
bool SynchroniseData()
which can be called if we want to fetch data from server which is very important for our application. This call signifies to the DLL our intention that we want to fetch the data. It does not fetch the data. Instead it returns true, if the request was successfully send to their application.
When data are actually fetched in the CServer
object, CServer
fires the event onDataFetched
. We listen to that event and process the data. The CServer
always has the latest data, since it continuously synchronises the data with our Vendor's servers.
However, there are many times at which the event onDataSynchronisationStopped
is called. This signifies that the CServer
object will stop data synchronisation with the server. This event is fired when the network is momentarily down, or if the server has some minor delays and so on.
We always want to have that data, and thus we try to fetch them again.
We currently do it like this:
private void OnDataFetchedHandler(object sender, EventArgs eventArgs){
try{
bool dataHaveBeenFetched;
do{
dataHaveBeenFetched = TrytoFetchData((CServer) sender);
Thread.Sleep(1000);
} while (!dataHaveBeenFetched);
}
catch (Exception ex){
Log.ErrorFormat(ex.Message, ex);
}
}
private bool TrytoFetchData(CServer sender){
sender.SynchroniseData();
ManualResetEvent manualResetEvent = new ManualResetEvent(false);
EventHandler manualResetEventSethandler = (s, e) => manualResetEvent.Set();
sender.OnDataFetched += manualResetEventSethandler;
bool dataHaveBeenFetched = manualResetEvent.WaitOne(new TimeSpan(0, 0, 3, 0));
sender.OnDataFetched -= manualResetEventSethandler;
return dataHaveBeenFetched;
}
Is there any cleaner way of doing this?
c#
$endgroup$
1
$begingroup$
Why does the loop in the event handler has to wait 1 second? What for? Shouldn't the event be fired everytime data arrives? Mhmm this is a weird...
$endgroup$
– t3chb0t
12 hours ago
add a comment |
$begingroup$
We use a third party dll which has an object called CServer and was provided by one of our software vendors to act as an API between our applications and their applications.
CServer has the following method:
bool SynchroniseData()
which can be called if we want to fetch data from server which is very important for our application. This call signifies to the DLL our intention that we want to fetch the data. It does not fetch the data. Instead it returns true, if the request was successfully send to their application.
When data are actually fetched in the CServer
object, CServer
fires the event onDataFetched
. We listen to that event and process the data. The CServer
always has the latest data, since it continuously synchronises the data with our Vendor's servers.
However, there are many times at which the event onDataSynchronisationStopped
is called. This signifies that the CServer
object will stop data synchronisation with the server. This event is fired when the network is momentarily down, or if the server has some minor delays and so on.
We always want to have that data, and thus we try to fetch them again.
We currently do it like this:
private void OnDataFetchedHandler(object sender, EventArgs eventArgs){
try{
bool dataHaveBeenFetched;
do{
dataHaveBeenFetched = TrytoFetchData((CServer) sender);
Thread.Sleep(1000);
} while (!dataHaveBeenFetched);
}
catch (Exception ex){
Log.ErrorFormat(ex.Message, ex);
}
}
private bool TrytoFetchData(CServer sender){
sender.SynchroniseData();
ManualResetEvent manualResetEvent = new ManualResetEvent(false);
EventHandler manualResetEventSethandler = (s, e) => manualResetEvent.Set();
sender.OnDataFetched += manualResetEventSethandler;
bool dataHaveBeenFetched = manualResetEvent.WaitOne(new TimeSpan(0, 0, 3, 0));
sender.OnDataFetched -= manualResetEventSethandler;
return dataHaveBeenFetched;
}
Is there any cleaner way of doing this?
c#
$endgroup$
We use a third party dll which has an object called CServer and was provided by one of our software vendors to act as an API between our applications and their applications.
CServer has the following method:
bool SynchroniseData()
which can be called if we want to fetch data from server which is very important for our application. This call signifies to the DLL our intention that we want to fetch the data. It does not fetch the data. Instead it returns true, if the request was successfully send to their application.
When data are actually fetched in the CServer
object, CServer
fires the event onDataFetched
. We listen to that event and process the data. The CServer
always has the latest data, since it continuously synchronises the data with our Vendor's servers.
However, there are many times at which the event onDataSynchronisationStopped
is called. This signifies that the CServer
object will stop data synchronisation with the server. This event is fired when the network is momentarily down, or if the server has some minor delays and so on.
We always want to have that data, and thus we try to fetch them again.
We currently do it like this:
private void OnDataFetchedHandler(object sender, EventArgs eventArgs){
try{
bool dataHaveBeenFetched;
do{
dataHaveBeenFetched = TrytoFetchData((CServer) sender);
Thread.Sleep(1000);
} while (!dataHaveBeenFetched);
}
catch (Exception ex){
Log.ErrorFormat(ex.Message, ex);
}
}
private bool TrytoFetchData(CServer sender){
sender.SynchroniseData();
ManualResetEvent manualResetEvent = new ManualResetEvent(false);
EventHandler manualResetEventSethandler = (s, e) => manualResetEvent.Set();
sender.OnDataFetched += manualResetEventSethandler;
bool dataHaveBeenFetched = manualResetEvent.WaitOne(new TimeSpan(0, 0, 3, 0));
sender.OnDataFetched -= manualResetEventSethandler;
return dataHaveBeenFetched;
}
Is there any cleaner way of doing this?
c#
c#
edited 21 mins ago
Jamal♦
30.3k11116226
30.3k11116226
asked 12 hours ago
andreasandreas
1
1
1
$begingroup$
Why does the loop in the event handler has to wait 1 second? What for? Shouldn't the event be fired everytime data arrives? Mhmm this is a weird...
$endgroup$
– t3chb0t
12 hours ago
add a comment |
1
$begingroup$
Why does the loop in the event handler has to wait 1 second? What for? Shouldn't the event be fired everytime data arrives? Mhmm this is a weird...
$endgroup$
– t3chb0t
12 hours ago
1
1
$begingroup$
Why does the loop in the event handler has to wait 1 second? What for? Shouldn't the event be fired everytime data arrives? Mhmm this is a weird...
$endgroup$
– t3chb0t
12 hours ago
$begingroup$
Why does the loop in the event handler has to wait 1 second? What for? Shouldn't the event be fired everytime data arrives? Mhmm this is a weird...
$endgroup$
– t3chb0t
12 hours ago
add a comment |
1 Answer
1
active
oldest
votes
$begingroup$
Instead of do ... while
loop you can use SpinWait.SpinUntil
:
bool dataHaveBeenFetched = SpinWait.SpinUntil(() => TrytoFetchData((CServer)sender))
And as @t3chb0t noted it seems strange to sleep 1 second between TrytoFetchData
calls.
$endgroup$
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
return StackExchange.using("mathjaxEditing", function () {
StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix) {
StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["\$", "\$"]]);
});
});
}, "mathjax-editing");
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: "196"
};
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: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
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%2fcodereview.stackexchange.com%2fquestions%2f212218%2fsynchronising-data-in-c%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
$begingroup$
Instead of do ... while
loop you can use SpinWait.SpinUntil
:
bool dataHaveBeenFetched = SpinWait.SpinUntil(() => TrytoFetchData((CServer)sender))
And as @t3chb0t noted it seems strange to sleep 1 second between TrytoFetchData
calls.
$endgroup$
add a comment |
$begingroup$
Instead of do ... while
loop you can use SpinWait.SpinUntil
:
bool dataHaveBeenFetched = SpinWait.SpinUntil(() => TrytoFetchData((CServer)sender))
And as @t3chb0t noted it seems strange to sleep 1 second between TrytoFetchData
calls.
$endgroup$
add a comment |
$begingroup$
Instead of do ... while
loop you can use SpinWait.SpinUntil
:
bool dataHaveBeenFetched = SpinWait.SpinUntil(() => TrytoFetchData((CServer)sender))
And as @t3chb0t noted it seems strange to sleep 1 second between TrytoFetchData
calls.
$endgroup$
Instead of do ... while
loop you can use SpinWait.SpinUntil
:
bool dataHaveBeenFetched = SpinWait.SpinUntil(() => TrytoFetchData((CServer)sender))
And as @t3chb0t noted it seems strange to sleep 1 second between TrytoFetchData
calls.
answered 9 hours ago
MaximMaxim
2,447216
2,447216
add a comment |
add a comment |
Thanks for contributing an answer to Code Review Stack Exchange!
- 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.
Use MathJax to format equations. MathJax reference.
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%2fcodereview.stackexchange.com%2fquestions%2f212218%2fsynchronising-data-in-c%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
1
$begingroup$
Why does the loop in the event handler has to wait 1 second? What for? Shouldn't the event be fired everytime data arrives? Mhmm this is a weird...
$endgroup$
– t3chb0t
12 hours ago