0

我有一个服务器-客户端环境,客户端每 5 秒连接一次服务器并与服务器同步数据。

为了进行同步,我在客户端上使用了一个运行良好的后台线程,但在一个特定的硬件上,GetNetworkAvailable 方法偶尔会抛出内存异常。这些错误在没有逻辑的情况下发生,所以我猜这个硬件有些不好。无论如何,我想听听您对我的背景的意见 - 投票功能。

private void SynchronizedWorker()
    {
        bool initialization = true;
        int initializationTries = 0;

        // Sync loop
        while (!_shouldStop)
        {
            // Initialize locals
            int syncInterval = _syncInterval; // Reset Sync Interval to default
            SyncStatus syncStatus = SyncStatus; // Get current Status
            bool hasNetworkConnection = true; // Has Network connection

            try
            {
                //*******************************************
                // Check Network connection
                //*******************************************
                if (!NetworkInterface.GetIsNetworkAvailable())
                {
                    hasNetworkConnection = false;
                    _syncResetEvent.Set();
                    syncStatus = SyncStatus.Offline;
                }
                else if (syncStatus == SyncStatus.Offline) // Is in offline - State, but Network available again recognize going online
                {
                    _syncResetEvent.Set();
                    hasNetworkConnection = IsServiceAvailable();
                    // Sync-Status stays offline
                    if (!hasNetworkConnection)
                    {
                        // Wait 1 minute, before retry
                        syncInterval = 60000;
                    }
                }

                //*******************************************
                // Proceed with Syncronisation
                //*******************************************
                if (hasNetworkConnection)
                {
                    syncStatus = SyncStatus.Ok;
                    // Try Initialization
                    if (initialization)
                    {
                        try
                        {
                            // Sync initialization here...
                            // ..............................
                            ////////////////////////////////////
                        }
                        catch (Exception ex)
                        {
                            log.LogError(string.Format("Initialization Try {0}", initializationTries), ex);
                            syncStatus = SyncStatus.InitializationFailed;
                        }
                    }

                    // To many Init-Tries --> Stop
                    if (initializationTries > 1)
                    {
                        // Proceed
                        _syncResetEvent.Set();
                        _syncStatus = syncStatus;
                        break; // Stop Synch
                    }

                    // Debug
                    var sw = System.Diagnostics.Stopwatch.StartNew();

                    // Do Up/Download
                    if (!initialization)
                    {
                        try
                        {
                            // Synchronisation with service here...
                            // ..............................
                            ////////////////////////////////////

                            // Proceed
                            _syncResetEvent.Set();
                        }
                        catch (Exception ex)
                        {
                            log.LogError("Download", ex);
                            syncStatus = SyncStatus.SynchFailed;
                        }
                    }
                }

                // Set Sync status
                _syncStatus = syncStatus;
            }
            catch (Exception ex)
            {
                log.LogError("Sync-Worker", ex);
                _syncStatus = Core.Sync.SyncStatus.SynchFailed;
                // Proceed
                _syncResetEvent.Set();
                // Reset Force
                _syncForce = false;
            }
            finally
            {
                // Set Completed
                if (OnSyncCompleted != null)
                {
                    OnSyncCompleted(downloaded, uploaded, executed);
                }

                // Always Wait for Interval
                DateTime sleepuntil = DateTime.Now.AddMilliseconds(syncInterval);
                while (sleepuntil > DateTime.Now && !_shouldStop && !_syncForce)
                {
                    // Sleep
                    Thread.Sleep(100);
                }
            }
        }

        // Stop
        _syncStatus = SyncStatus.Unknown;
 }
4

0 回答 0