0

重複の可能性:
別のスレッドが所有しているため、呼び出し元のスレッドはこのオブジェクトにアクセスできません

Serialport プログラムで次のエラーが発生します。

別のスレッドがこのオブジェクトを所有しているため、呼び出し元のスレッドはこのオブジェクトにアクセスできません。wpf

UI を更新するためのタイマー機能があり、同時にユーザーは任意のボタンを押してシリアル ポートと通信できます。

public MainWindow()
{
    InitializeComponent();

    OpenPort();

    Timer aTimer = new System.Timers.Timer();
    aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
    aTimer.Interval = 5000;
    aTimer.Enabled = true;
}

そしてここで私の2つの機能:

private void OnTimedEvent(object sender, EventArgs e)
{
    CheckStatus(); // this function will update my UI base of information will receive from serial port         
}

private void Processing()
{
    // Do stuff with serial port
}
4

3 に答える 3

2

UIを更新するタイマー機能があります

Dispatcher.Invokeを使用して、他のスレッドから GUI を変更します。

WPF では、DispatcherObject を作成したスレッドのみがそのオブジェクトにアクセスできます。たとえば、メイン UI スレッドからスピンオフされたバックグラウンド スレッドは、UI スレッドで作成された Button の内容を更新できません。バックグラウンド スレッドが Button の Content プロパティにアクセスするには、バックグラウンド スレッドが UI スレッドに関連付けられた Dispatcher に作業を委任する必要があります。これは、Invoke または BeginInvoke を使用して実行されます。Invoke は同期で、BeginInvoke は非同期です。

于 2013-02-04T04:40:27.603 に答える
0

System.Timers.Timerメイン UI スレッドとは別のスレッドで tick イベントが生成されることに注意してください。で簡単に確認できます

System.Diagnostics.Debug.WriteLine(System.Threading.Thread.CurrentThread.ManagedThreadId);

この場合Dispatcher.Invoke、すでに @Habib が指摘しているように、UI 要素を更新するために呼び出す必要があります。

一方、代わりにDispatcherTimer (WPF で導入されたタイマー) を使用することもできますSystem.Timers.Timer。tick イベントを使用DispatcherTimerすると、メイン UI スレッドで発生し、問題なく UI を変更できます。

于 2013-02-04T07:45:18.123 に答える