1

私はWindowsフォームアプリケーションを使用した開発に不慣れであり、取るべきベストプラクティスアプローチに関するヘルプ/ガイダンスで実行できる問題があります。

バックグラウンド:

フォームベースのアプリケーションがあり、WCFサービスからのデータで毎分更新してから、リストビューコントロールの最新の結果でUIを更新する必要があります。私はこれをすべて原則として機能させていますが、アプリケーションが断続的にクラッシュするため、これを解決する必要があります。以下のコードの主要部分を削除しました。実際のナットとボルトはおそらく必要ありません。

コード:

public partial class Form1 : Form
{
readonly MatchServiceReference.MatchServiceClient _client = new MatchServiceReference.MatchServiceClient();

public Form1()
    {
        _client.GetMMDataCompleted += new EventHandler<GetMMDataCompletedEventArgs>(_client_GetMMDataCompleted);
    }    

//Arm Timer
private void ArmTimer(object sender, EventArgs e)
    {
        aTimer = new Timer();

        aTimer.Elapsed += OnTimedEvent;

        aTimer.Interval = 60000;
        aTimer.Enabled = true;
    }

//Timer elapsed event
 private void OnTimedEvent(object source, ElapsedEventArgs e)
    {
        try
        {
            LoadMatches();

            if (LastUpdated.InvokeRequired)
            {
                LastUpdated.Invoke(new MethodInvoker(delegate { LastUpdated.Text = e.SignalTime.ToString(); }));
            }
        }
        catch (Exception exception)
        {

        }

    }

//Load matches
private void LoadMatches()
    {
        try
        {
            aTimer.Enabled = false;
            _client.GetMMDataAsync();
        }
        catch (Exception e)
        {
            //EventLog.WriteEntry("Application", e.InnerException.ToString(), EventLogEntryType.Error);
            aTimer.Enabled = true;
        }
    }

void _client_GetMMDataCompleted(object sender, GetMMDataCompletedEventArgs e)
    {
        if (e.Result != null)
        {

            var matches = e.Result;

            Debug.WriteLine("Matches received from service");

            if (!IsHandleCreated && !IsDisposed) return;

            // Invoke an anonymous method on the thread of the form.
            Invoke((MethodInvoker) delegate
                                       {
                                           try
                                           {
                                               LoadTheMonitorMatches(matches);
                                           }
                                           catch (Exception exception)
                                           {
                                               Debug.WriteLine("INNER EXCEPTION" + exception.InnerException);
                                               Debug.WriteLine("EXCEPTION MESSAGE" + exception.Message);
                                           }
                                       });
        }
        aTimer.Enabled = true;
    }
}

}

例外:

私が得ている例外は次のとおりです-

例外情報:System.Reflection.TargetInvocationExceptionスタック:at System.ComponentModel.AsyncCompletedEventArgs.RaiseExceptionIfNecessary()at MM.MatchServiceReference.GetMMDataCompletedEventArgs.get_Result()at MM.Form1._client_GetMMDataCompleted(System.Object、MM.MatchServiceReference.GetMMDataCompletedEvent MatchServiceReference.MatchServiceClient.OnGetMMDataCompleted(System.Object)at System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(System.Object)at System.Threading.ExecutionContext.runTryCode(System.Object)at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode、CleanupCode 、System.Object)at System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext、System.Threading.ContextCallback、System.Object)atSystem。System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()at System.Threading.ThreadPoolWorkQueue.Dispatch()のThreading.ExecutionContext.Run(System.Threading.ExecutionContext、System.Threading.ContextCallback、System.Object、Boolean) System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()で

これに関するヘルプ/アドバイスをいただければ幸いです。

乾杯

4

2 に答える 2

2

間違ったタイマーを使用しています。はSystem.Timers.Timerサーバーでの使用を目的としています。Winformアプリケーションの場合は、を使用しSystem.Windows.Forms.Timerて、フォームのコントロールとして追加する必要があります。これを使用すると、UIはタイマーティック間で応答しますが、データを取得しようとすると、UIは応答しなくなります。十分でない場合は、を使用する必要がありますBackgroundWorker

これらのコンポーネントを使用しても問題が解決しない場合は、もう一度質問してください。

于 2012-09-27T14:14:23.907 に答える
1

この線

  if (e.Result != null)

実際に結果を得るためにゲッターを呼び出しています。イベント引数はAsyncCompletedEventArgsから派生するため、操作がキャンセルまたはエラーになった場合、エラーが発生する可能性があります。結果をテストする前に、キャンセルされたプロパティとエラーのプロパティを最初に確認してください。問題をトラップできるはずです。

ドキュメントから: If the component's asynchronous worker code assigns an exception to the Error property or sets the Cancelled property to true, the property will raise an exception if a client tries to read its value.

于 2012-09-27T15:34:27.020 に答える