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 堆栈:在 System.ComponentModel.AsyncCompletedEventArgs.RaiseExceptionIfNecessary() 在 MM.Form1._client_GetMMDataCompleted(System.Object, MM.MatchServiceReference.GetMMDataCompletedEventArgs) 在 MM.MatchServiceReference.GetMMDataCompletedEventArgs.get_Result() 在 MM。 MatchServiceReference.MatchServiceClient.OnGetMMDataCompleted(System.Object) 在 System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(System.Object) 在 System.Threading.ExecutionContext.runTryCode(System.Object) 在 System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode, CleanupCode , System.Object) 在 System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object) 在 System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) 在 System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem() 在 System.Threading.ThreadPoolWorkQueue.Dispatch()在 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)

实际上是调用 getter 来获取结果。由于事件 args 派生自 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 回答