Synchronising data in C#












0












$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?










share|improve this question











$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


















0












$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?










share|improve this question











$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
















0












0








0





$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?










share|improve this question











$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#






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited 18 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
















  • 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












1 Answer
1






active

oldest

votes


















0












$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.






share|improve this answer









$endgroup$













    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
    });


    }
    });














    draft saved

    draft discarded


















    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









    0












    $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.






    share|improve this answer









    $endgroup$


















      0












      $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.






      share|improve this answer









      $endgroup$
















        0












        0








        0





        $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.






        share|improve this answer









        $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.







        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered 9 hours ago









        MaximMaxim

        2,447216




        2,447216






























            draft saved

            draft discarded




















































            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.




            draft saved


            draft discarded














            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





















































            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

            Сан-Квентин

            Алькесар

            Josef Freinademetz