内部异常:调用线程无法访问该对象,因为它属于另一个线程
本文关键字:线程 因为 对象 另一个 属于 访问 异常 调用 内部 | 更新日期: 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
。在这种情况下,请使用Dispatcher
或Dispatcher.CurrentDispatcher
。
最后但并非最不重要的是,我很确定XamlParseException
中还有另一个InnerException
说Initialization of 'System.Windows.Controls.Button' threw an exception
。也请核对一下。这可能是另一个原因,也可能和上面一样。它要么在继承自Button
的控件的构造函数中,要么可能在XAML.