gpt4 book ai didi

c# - 我收到有关使用不同线程的错误消息?

转载 作者:太空宇宙 更新时间:2023-11-03 19:25:58 24 4
gpt4 key购买 nike

当我单击我的 ActionButton 时,有一个计时器启动,3 秒后,它必须触发一个方法以将当前的 ContentPage 更改为另一个页面。但我收到一条消息:调用线程无法访问此对象,因为另一个线程拥有它。我不明白我做错了什么。但是,如果我将 ChangeContent() 方法放在 click_event 中,它会起作用,但在 _tm_elapsed 中它真的起作用吗?

using smartHome2011.FramePages;
using System.Timers;

public partial class AuthenticationPage : UserControl
{
private MainWindow _main;
private Storyboard _storyboard;
private Timer _tm = new Timer();
private HomeScreen _homeScreen = new HomeScreen();

public AuthenticationPage(MainWindow mainP)
{
this.InitializeComponent();
_main = mainP;
}

private void ActionButton_Click(object sender, System.EventArgs eventArgs)
{
_main.TakePicture();
identifyBox.Source = _main.source.Clone();
scanningLabel.Visibility = Visibility.Visible;
_storyboard = (Storyboard) FindResource("scanningSB");
//_storyboard.Begin();
Start();
}

private void Start()
{
_tm = new Timer(3000);
_tm.Elapsed += new ElapsedEventHandler(_tm_Elapsed);
_tm.Enabled = true;
}

private void _tm_Elapsed(object sender, ElapsedEventArgs e)
{
((Timer) sender).Enabled = false;
ChangeContent();
//MessageBox.Show("ok");
}

private void ChangeContent()
{
_main.ContentPage.Children.Clear();
_main.ContentPage.Children.Add(_homeScreen);
}
}

最佳答案

描述

您必须使用 Invoke 来确保 UI 线程(创建您的控件的线程)将执行它。

1。如果您正在使用 Windows 窗体,那么请执行此操作

示例

private void ChangeContent()
{
if (this.InvokeRequired)
{
this.Invoke(new MethodInvoker(ChangeContent));
return;
}

_main.ContentPage.Children.Clear();
_main.ContentPage.Children.Add(_homeScreen);
}

2。如果你正在做 WPF,那么这样做

private void _tm_Elapsed(object sender, ElapsedEventArgs e)
{
((Timer) sender).Enabled = false;
this.Dispatcher.Invoke(new Action(ChangeContent), null);
//MessageBox.Show("ok");
}

更多信息

窗体

WPF

关于c# - 我收到有关使用不同线程的错误消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8699839/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com