私は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()で
これに関するヘルプ/アドバイスをいただければ幸いです。
乾杯