调用线程必须是STA

讨厌的青蛙

我试图模拟一个弹丸,并试图在定时事件中仅创建一次标签,因为它在参数中有一个对象,我需要在定时事件中。但是我运行它时收到此线程错误。请帮忙!

我的代码是:

    void onTimedEvent(Object source, ElapsedEventArgs e)
    {
        particle newProjectile;
        newProjectile = new particle();

        bool LabelExist = false;
        if (LabelExist == false)
        {
            CreateLabels(newProjectile);
        }
    }

        aTimer = new System.Timers.Timer(200);
        aTimer.Elapsed += onTimedEvent;
        aTimer.Enabled = true;

    void CreateLabels(particle newProjectile)
    {
        DockPanel panelcontrol_displacement, panelcontrol_CurrentVel, panelcontrol_VerticalVel, panelcontrol_HorizontalVel, panelcontrol_Time;
        Label lbl_TimeUnits, lbl_TimeOutput, lbl_Time, lbl_DisplacementOutput, lbl_DisplacementUnits, lbl_Displacement, lbl_CurrentVel, lbl_CurrentVelOutput, lbl_HorizontalVelocityOutputs, lbl_HorizontalVelocityUnits, lbl_VerticalVelocity, lbl_HorizontalVelocity, lbl_CurrentVelUnits, lbl_VerticalVelocityOutput, lbl_VerticalVelocityUnits;
        lbl_Time = new Label();
        lbl_Time.Content = "Time";
        lbl_Time.Height = 30;
        lbl_Time.Width = 110;
        lbl_TimeOutput = new Label();
        lbl_TimeOutput.Content = "20";
        lbl_TimeOutput.Height = 30;
        lbl_TimeOutput.Width = 100;
        lbl_TimeOutput.HorizontalContentAlignment = HorizontalAlignment.Right;
        lbl_TimeUnits = new Label();
        lbl_TimeUnits.Content = "s";
        lbl_CurrentVel = new Label();
        lbl_CurrentVel.Content = "Current Velocity";
        lbl_CurrentVel.Height = 30;
        lbl_CurrentVel.Width = 110;
        lbl_CurrentVelOutput = new Label();
        lbl_CurrentVelOutput.Content = "20";
        lbl_CurrentVelOutput.Height = 30;
        lbl_CurrentVelOutput.Width = 100;
        lbl_CurrentVelOutput.HorizontalContentAlignment = HorizontalAlignment.Right;
        lbl_CurrentVelUnits = new Label();
        lbl_CurrentVelUnits.Content = "m/s";
        lbl_VerticalVelocity = new Label();
        lbl_VerticalVelocity.Content = "Verticle Velocity";
        lbl_VerticalVelocity.Height = 30;
        lbl_VerticalVelocity.Width = 110;
        lbl_VerticalVelocityOutput = new Label();
        lbl_VerticalVelocityOutput.Content = "20";
        lbl_VerticalVelocityOutput.Height = 30;
        lbl_VerticalVelocityOutput.Width = 100;
        lbl_VerticalVelocityOutput.HorizontalContentAlignment = HorizontalAlignment.Right;
        lbl_VerticalVelocityUnits = new Label();
        lbl_VerticalVelocityUnits.Content = "m/s";
        lbl_HorizontalVelocity = new Label();
        lbl_HorizontalVelocity.Content = "Horizontal Velocity";
        lbl_HorizontalVelocity.Height = 30;
        lbl_HorizontalVelocity.Width = 110;
        lbl_HorizontalVelocityOutputs = new Label();
        lbl_HorizontalVelocityOutputs.Content = "20";
        lbl_HorizontalVelocityOutputs.Height = 30;
        lbl_HorizontalVelocityOutputs.Width = 100;
        lbl_HorizontalVelocityOutputs.HorizontalContentAlignment = HorizontalAlignment.Right;
        lbl_HorizontalVelocityUnits = new Label();
        lbl_HorizontalVelocityUnits.Content = "m/s";
        lbl_Displacement = new Label();
        lbl_Displacement.Content = "Displacement";
        lbl_Displacement.Height = 30;
        lbl_Displacement.Width = 110;
        lbl_DisplacementOutput = new Label();
        lbl_DisplacementOutput.Content = "20";
        lbl_DisplacementOutput.Height = 30;
        lbl_DisplacementOutput.Width = 100;
        lbl_DisplacementOutput.HorizontalContentAlignment = HorizontalAlignment.Right;
        lbl_DisplacementUnits = new Label();
        lbl_DisplacementUnits.Content = "m/s";
        panelcontrol_HorizontalVel = new DockPanel();
        panelcontrol_CurrentVel = new DockPanel();
        panelcontrol_VerticalVel = new DockPanel();
        panelcontrol_displacement = new DockPanel();
        panelcontrol_Time = new DockPanel();
        panelcontrol_CurrentVel.Children.Add(lbl_CurrentVel);
        panelcontrol_CurrentVel.Children.Add(lbl_CurrentVelOutput);
        panelcontrol_CurrentVel.Children.Add(lbl_CurrentVelUnits);
        panelcontrol_VerticalVel.Children.Add(lbl_VerticalVelocity);
        panelcontrol_VerticalVel.Children.Add(lbl_VerticalVelocityOutput);
        panelcontrol_VerticalVel.Children.Add(lbl_VerticalVelocityUnits);
        panelcontrol_HorizontalVel.Children.Add(lbl_HorizontalVelocity);
        panelcontrol_HorizontalVel.Children.Add(lbl_HorizontalVelocityOutputs);
        panelcontrol_HorizontalVel.Children.Add(lbl_HorizontalVelocityUnits);
        panelcontrol_displacement.Children.Add(lbl_Displacement);
        panelcontrol_displacement.Children.Add(lbl_DisplacementOutput);
        panelcontrol_displacement.Children.Add(lbl_DisplacementUnits);
        panelcontrol_Time.Children.Add(lbl_Time);
        panelcontrol_Time.Children.Add(lbl_TimeOutput);
        panelcontrol_Time.Children.Add(lbl_TimeUnits);
        StkPnl_Inputs.Children.Add(panelcontrol_Time);
        StkPnl_Inputs.Children.Add(panelcontrol_CurrentVel);
        StkPnl_Inputs.Children.Add(panelcontrol_VerticalVel);
        StkPnl_Inputs.Children.Add(panelcontrol_HorizontalVel);
        StkPnl_Inputs.Children.Add(panelcontrol_displacement);
        //databinding
        Binding(newProjectile, lbl_CurrentVelOutput, "CurrentVelocity");
    }
肯尼兹

您收到此错误,是因为不允许它从后台线程访问UI(System.Timers.Timer.Elapsed处理程序在后台线程上运行)。这是因为在WPF中处理UI的所有线程都应Single Threaded Apartment(STA)出于同步目的而运行并且,后台工作者不在STA中运行。

使用DispatcherTimer而不是System.Timers.Timer

MSDN页面的备注部分概述了这两个计时器之间的区别。

如果在WPF应用程序中使用了System.Timers.Timer,则值得注意的是System.Timers.Timer在与用户界面(UI)线程不同的线程上运行。为了访问用户界面(UI)线程上的对象,必须使用Invoke或BeginInvoke将操作发布到用户界面(UI)线程的Dispatcher上。

使用与System.Timers.Timer相对的DispatcherTimer的原因是DispatcherTimer与Dispatcher在同一线程上运行,并且可以在DispatcherTimer上设置DispatcherPriority。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

打开新窗口“调用线程必须是STA”

来自分类Dev

WPF和后台工作程序以及调用线程必须是STA

来自分类Dev

例外:调用线程必须是STA,因为许多UI组件都需要STA

来自分类Dev

调用线程必须是STA,因为许多UI组件都需要STA。VB.NET

来自分类Dev

例外:调用线程必须是STA,因为许多UI组件都需要STA

来自分类Dev

调用线程必须是STA,因为许多UI组件都需要STA,这发生在WPF的主函数中

来自分类Dev

WPF-尝试在“任务”中打开新窗口,但收到“调用线程必须是STA异常”

来自分类Dev

InvalidOperationException,调用线程应为STA,因为

来自分类Dev

InvalidOperationException,调用线程应该是STA,因为

来自分类Dev

Android错误:必须从主线程调用recreate()

来自分类Dev

纸板样品,必须从UI线程调用方法

来自分类Dev

方法getText()必须从UI线程调用

来自分类Dev

Unity Firebase SetCurrentScreen 必须从主线程调用

来自分类Dev

方法 loadVideoFromAsset 必须从 UI 线程调用

来自分类Dev

一个MTA控制台应用程序从多个线程调用STA COM对象

来自分类Dev

F#STA线程异步

来自分类Dev

Android:Volley:为什么必须从主线程调用volley imageLoader?

来自分类Dev

方法getCheckedRadioButtonId必须从UI线程Android调用吗?

来自分类Dev

复制字符串到剪贴板中的“当前线程必须设置为单线程单元(STA)”错误

来自分类Dev

复制字符串到剪贴板中的“当前线程必须设置为单线程单元(STA)”错误

来自分类Dev

Android Studio错误:“必须从UI线程调用方法getText(),当前推断的线程为worker

来自分类Dev

错误:“必须从UI线程调用方法getText(),当前推断的线程为worker。” 在Android Studio中

来自分类Dev

Android 错误,方法 getText 必须从 UI 线程调用,当前推断的线程是 worker。该怎么办?

来自分类Dev

StaTaskScheduler和STA线程消息泵送

来自分类Dev

任务-如何确保ContinueWith操作是STA线程?

来自分类Dev

滑行断言:java.lang.IllegalArgumentException:您必须在主线程上调用此方法

来自分类Dev

ADMOB-java.lang.IllegalStateException:isLoaded必须在主UI线程上调用

来自分类Dev

必须在主UI线程上调用AdMob非页内广告和错误isLoaded

来自分类Dev

QCoreApplication :: processEvents-为什么必须仅从主线程调用它?

Related 相关文章

  1. 1

    打开新窗口“调用线程必须是STA”

  2. 2

    WPF和后台工作程序以及调用线程必须是STA

  3. 3

    例外:调用线程必须是STA,因为许多UI组件都需要STA

  4. 4

    调用线程必须是STA,因为许多UI组件都需要STA。VB.NET

  5. 5

    例外:调用线程必须是STA,因为许多UI组件都需要STA

  6. 6

    调用线程必须是STA,因为许多UI组件都需要STA,这发生在WPF的主函数中

  7. 7

    WPF-尝试在“任务”中打开新窗口,但收到“调用线程必须是STA异常”

  8. 8

    InvalidOperationException,调用线程应为STA,因为

  9. 9

    InvalidOperationException,调用线程应该是STA,因为

  10. 10

    Android错误:必须从主线程调用recreate()

  11. 11

    纸板样品,必须从UI线程调用方法

  12. 12

    方法getText()必须从UI线程调用

  13. 13

    Unity Firebase SetCurrentScreen 必须从主线程调用

  14. 14

    方法 loadVideoFromAsset 必须从 UI 线程调用

  15. 15

    一个MTA控制台应用程序从多个线程调用STA COM对象

  16. 16

    F#STA线程异步

  17. 17

    Android:Volley:为什么必须从主线程调用volley imageLoader?

  18. 18

    方法getCheckedRadioButtonId必须从UI线程Android调用吗?

  19. 19

    复制字符串到剪贴板中的“当前线程必须设置为单线程单元(STA)”错误

  20. 20

    复制字符串到剪贴板中的“当前线程必须设置为单线程单元(STA)”错误

  21. 21

    Android Studio错误:“必须从UI线程调用方法getText(),当前推断的线程为worker

  22. 22

    错误:“必须从UI线程调用方法getText(),当前推断的线程为worker。” 在Android Studio中

  23. 23

    Android 错误,方法 getText 必须从 UI 线程调用,当前推断的线程是 worker。该怎么办?

  24. 24

    StaTaskScheduler和STA线程消息泵送

  25. 25

    任务-如何确保ContinueWith操作是STA线程?

  26. 26

    滑行断言:java.lang.IllegalArgumentException:您必须在主线程上调用此方法

  27. 27

    ADMOB-java.lang.IllegalStateException:isLoaded必须在主UI线程上调用

  28. 28

    必须在主UI线程上调用AdMob非页内广告和错误isLoaded

  29. 29

    QCoreApplication :: processEvents-为什么必须仅从主线程调用它?

热门标签

归档