我在C#中遇到多线程问题.我使用一个事件来更新另一个线程的表单中的标签,当然我需要使用Invoke()命令.那部分也很好.但是,用户可以关闭表单,如果在不幸的时间发送事件,程序可能会崩溃.
所以,我想我会简单地覆盖窗体的Dispose()方法,在锁定代码中将布尔值设置为true,并检查布尔值并在锁定代码中调用事件.
但是,每次关闭表单时程序都会完全冻结.
以下是代码中提到的部分:
private object dispose_lock = new object();
private bool _disposed = false;
private void update(object sender, EventArgs e)
{
if (InvokeRequired)
{
EventHandler handler = new EventHandler(update);
lock (dispose_lock)
{
if (_disposed) return;
Invoke(handler); // this is where it crashes without using the lock
}
return;
}
label.Text = "blah";
}
protected override void Dispose(bool disposing)
{
eventfullObject.OnUpdate -= update;
lock (dispose_lock) // this is where it seems to freeze
{
_disposed = true; // this is …Run Code Online (Sandbox Code Playgroud) 观察到的行为(这里的所有内容都在Windows 10上):
这一切都没有打开任何项目或文件,但在这种情况下也会发生.
我注意到了这一点,因为我最初正在调查WPF应用程序的类似行为(在用户报告此问题之后).
在尝试隔离问题时,我发现即使是一个全新的WPF项目,只有一个空窗口,行为完全相同(无论是否通过Visual Studio运行).
通过分析和调试,我发现应用程序似乎花了大量时间处理Windows消息.
具体来说,我发现它似乎几乎只是WM_PAINT消息(我们每秒钟很容易谈论数百或数千条消息 - 似乎CPU可以处理多少消息).
我没有运行过的其他程序(chrome,skype,sublime text,..)就是这样的.
有没有人见过这种行为?和/或任何可能导致这种情况的想法,或者我如何进一步调查这一点?
当然,我无法修复Visual Studio(除非问题出在我的设置上),但我希望我可以对我的WPF应用程序做些什么.
我有一个相当复杂的 WPF UserControl,需要大量自定义样式,以及相同控件类型的几种不同样式。相同的样式没有在任何其他地方使用。
我想使用嵌套样式(使用Style.Resources)作为一种命名空间机制,如下所示:
用户控件示例:
<UserControl Style="{StaticResource AwesomeControl}>
<Grid>
<Button Style="{StaticResource ButtonA}"/>
<Button Style="{StaticResource ButtonB}"/>
</Grid>
</UserControl>
Run Code Online (Sandbox Code Playgroud)
我想如何定义我的风格:
<ResourceDictionary>
<Style TargetType="UserControl" x:Key="AwesomeControl">
<Style.Resources>
<Style TargetType="Button" x:Key="ButtonA"> </Style>
<Style TargetType="Button" x:Key="ButtonB"> </Style>
</Style.Resources>
</Style>
</ResourceDictionary>
Run Code Online (Sandbox Code Playgroud)
然而,这是行不通的。据我所知,似乎不可能通过键来处理嵌套样式。(我已经搜索了很多,但找不到一个例子来做这样的事情。)
我可以通过删除样式的嵌套并将它们全部保持在顶层来使其轻松工作。但是,然后我必须将它们的键更改为 等AwesomeControlButtonA,以将它们与应用程序的其他部分区分开来
这对我来说似乎并不理想。
所以我的问题是:
像我尝试使用上面的代码可能吗?如果没有,是否可以使用其他命名空间方法来防止像 AwesomeControlButtonA 这样的尴尬按键?