内部异常:调用线程无法访问该对象,因为它属于另一个线程

本文关键字:线程 因为 对象 另一个 属于 访问 异常 调用 内部 | 更新日期: 2023-09-27 18:12:42

每当我输入用户名和密码时,它都会抛出异常。但是当我单独运行它时,它运行得很好。

抛出异常:'System.Windows.Markup. 'XamlParseException' in PresentationFramework.dll

代码
private void testing()
{
    try
    {
        Thread newWindowThread = new Thread(new ThreadStart(() =>
        {
            SynchronizationContext.SetSynchronizationContext(
                new DispatcherSynchronizationContext(
                    Dispatcher.CurrentDispatcher));
            var loading_Win = new Loading_Window();
            loading_Win.Show();
            loading_Win.Closed += (s, ex) =>
                Dispatcher.CurrentDispatcher.BeginInvokeShutdown(
                    DispatcherPriority.Background);
            // Start the Dispatcher Processing
            System.Windows.Threading.Dispatcher.Run();
        }));
        // Set the apartment state
        newWindowThread.SetApartmentState(ApartmentState.STA);
        // Make the thread a background thread
        newWindowThread.IsBackground = true;
        // Start the thread
        newWindowThread.Start();
    }
    catch (Exception ex)
    { }
}

这是加载窗口cs

public partial class Loading_Window : MetroWindow
{
    public Random rnd = new Random();
    public static int intIteration = 1;
    private System.Windows.Forms.Timer timer1;
    public Loading_Window()
    {
        InitializeComponent();
        InitTimer();
        this.Closing += Loading_Window_Closing;
    }
    private void Loading_Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
    {
        //Process[] pro = null;
        //try
        //{
        //    pro = Process.GetProcessesByName("LeanPims");
        //    pro[0].Kill();
        //}
        //catch (Exception ex)
        //{ }
        //Process.GetCurrentProcess().Kill();
    }
    public void InitTimer()
    {            
        intIteration = 0;
        timer1 = new System.Windows.Forms.Timer();
        timer1.Tick += new EventHandler(timer1_Tick);
        timer1.Interval = 300; // in miliseconds
        timer1.Start();
    }
    public void timer1_Tick(object sender, EventArgs e)
    {
        intIteration += rnd.Next(1, 8);
        label1.Content = intIteration.ToString() + " %";
        try
        {
            if (intIteration >= 100)
            {
                timer1.Stop();
                timer1 = null;
                this.Close();
            }
        }
        catch (Exception ex) { }
    }
}

这是加载窗口xaml

<Viewbox Stretch="Fill">
    <Grid Height="500" Width="700" >
        <Image Stretch="Fill" Width="300" Height="350" gif:ImageBehavior.AnimatedSource="Images'Loading1.gif"  />
        <Rectangle HorizontalAlignment="Left" Height="45" Margin="298,228,0,0" StrokeThickness="2" VerticalAlignment="Top" Width="103" Fill="White"/>
        <Label Content="" x:Name="label1" HorizontalAlignment="Left" Height="36" Margin="327,236,0,0" VerticalAlignment="Top" Width="62" FontSize="18" FontFamily="Arial" Foreground="#FF837F7F" Background="{x:Null}" FontWeight="Bold"/>
        <Canvas x:Name="c1" HorizontalAlignment="Left" Height="406" Margin="112,38,0,0" VerticalAlignment="Top" Width="481"/>
    </Grid>
</Viewbox>

抛出异常:'System.Windows.Markup. 'XamlParseException' in PresentationFramework.dll

初始化System.Windows.Controls。

内部异常:调用线程无法访问该对象,因为它属于另一个线程

问题是您使用System.Windows.Forms.Timer来设置label1.Content

您要么必须使用System.Windows.Threading.DispatcherTimer代替,要么必须手动调用Dispatcher:

Dispatcher.Invoke(() => label1.Content = intIteration.ToString() + " %");

对于所有其他与ui相关的调用也是如此。

如果您不想使用DispatcherTimer,那么您也必须这样做:

Dispatcher.Invoke(() => this.Close());

但是必须有更多与ui相关的语句,因为你的XamlParseException声明Initialization of 'System.Windows.Controls.Button' threw an exception和我在你发布的代码中没有看到一个Button

因此,检查是否有任何其他与ui相关的调用,并使用正确的Dispatcher调用它们。(特别注意,如果应用程序中有多个Dispatchers,则不要在Loading_Window中使用Application.Current.Dispatcher。在这种情况下,请使用DispatcherDispatcher.CurrentDispatcher

最后但并非最不重要的是,我很确定XamlParseException中还有另一个InnerExceptionInitialization of 'System.Windows.Controls.Button' threw an exception。也请核对一下。这可能是另一个原因,也可能和上面一样。它要么在继承自Button的控件的构造函数中,要么可能在XAML.

的某个地方。
相关文章: