1

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);
    }
}
4

3 に答える 3

4

説明

InvokeUIスレッド(コントロールを作成したスレッド)がそれを実行することを確認するためにを使用する必要があります。

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");
}

詳しくは

Windowsフォーム

WPF

于 2012-01-02T10:43:20.957 に答える
1

Elapsedのイベントで実行されるロジックTimerは、残りのコードとは別のスレッドで実行されます。このスレッドは、メイン/GUIスレッド上のオブジェクトにアクセスできません。

このスレッドは、それを行う方法を見つけるのに役立つはずです:C#の別のスレッドからGUIを更新する方法は?

于 2012-01-02T10:44:18.680 に答える
1

System.Threading.Timerを使用していると思われます。Windows.Formsタイマーを使用するだけで、クロススレッド操作を回避できます。http: //msdn.microsoft.com/en-us/library/system.windows.forms.timer.aspx このタイマーは、通常のメッセージとイベントの発生を使用します。 UIの同じスレッド。使用するイベントは「Elapsed」とは呼ばれなくなりましたが、「Tick」は次のドキュメントを読んでください:http: //msdn.microsoft.com/en-us/library/system.windows.forms.timer.tick.aspx

于 2012-01-02T10:59:32.450 に答える