问题标签 [invalidoperationexception]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 在 WPF/C# 中生成复杂内容并将其传递给 GUI 线程
我知道并使用 xxx.Dispatcher.Invoke() 方法来获取后台线程来操作 GUI 元素。我想我遇到了一些类似但略有不同的东西,我想要一个长时间运行的后台任务来构建一个对象树,并在完成后将它交给 GUI 进行显示。
尝试这样做会导致 InvalidOperationException,“由于调用线程无法访问此对象,因为不同的线程拥有它。” 奇怪的是,简单类型不会发生这种情况。
下面是一些示例代码,演示了引发异常的简单案例。知道如何解决这个问题吗?我很确定问题是后台线程拥有工厂构造的对象,而前台 GUI 线程不能取得所有权,尽管它适用于更简单的系统类型。
问题的主要范围是我有一个在后台动态构建的大型文档,并且希望 GUI 能够显示到目前为止生成的内容,而无需等待完成。
后台工作人员如何充当对象工厂并将内容移交给主线程?
谢谢!
wcf - WCF 无效操作异常
我在使用 wcf 服务和 L2SQL DAL 时遇到了这个奇怪的问题。服务器托管在本地主机上,并包含对应接口的实现。客户端熟悉接口,偶尔通过暴露的服务使用 tcp 传输查询数据库。当客户端在本地运行时,一切都很好。但是,每当客户端在另一台机器上运行时,System.Data.dll 中就会抛出“InvalidOperationException”(传输仍然会被传递),并且随着时间的推移,通道会进入“故障”状态(并且传输无法传递)。我觉得我的应用程序中缺少一些非常基本的东西。谁能指出这种奇怪行为的可能原因?
c# - 为什么这个错误没有被捕获?
我的项目中有以下代码,deleteselector 是一个表单,上面有一个 datagridview(带有自动调整列)。
try catch 是因为一个带有 gridview 的弹出表单偶尔会引发一个无效操作异常。这是建议的解决方法,请参阅
早些时候,我在 deleteSelector 上使用了 Show,解决方法效果很好。现在,使用 showdialog 似乎不再捕获错误(我收到未捕获的错误消息)。为什么错误没有被捕获?
.net - 套接字/线程问题:Undo 操作遇到的上下文与相应的 Set 操作中应用的上下文不同
我遇到了上述很多问题的问题。我们有一个多年来一直运行良好的 TCP/IP 服务器应用程序。我现在需要允许应用程序接受来自直接连接的 USB 设备的连接,方法是在内部使用套接字连接修补服务器应用程序中的 localhost (127.0.0.1)。(顺便说一句,我提到 USB 只是为了解释我这样做的原因 - 作为调试此问题的一部分,我禁用了所有 USB 功能)。
沿着这个套接字的通信会导致在客户端和服务器端调用 GUI 元素。在客户端访问 GUI 元素会导致标题中的错误(下面的调用堆栈)。这里的关键问题之一是调试器无法停止异常:尽管所有异常都设置为在抛出时停止,但应用程序只是在错误发生时终止。
我的应用程序唯一看起来独特的是它使用内部套接字连接到 127.0.0.1。我还确认如果客户端被分离到一个单独的应用程序中,该应用程序可以正常工作。但是,由于其他原因,我不能将其用作永久解决方案。
有几篇文章讨论了我在下面列出的这类问题。不幸的是,在我的情况下似乎没有人提供解决方案:
- 大多数相关帖子都讨论了使用 Invoke 或 BeginInvoke 确保所有 GUI 操作都在 GUI 线程上执行的必要性。我相信我的应用程序可以正确执行此操作(它使用 Application.Forms 获取表单以获取主表单并在此调用 Invoke)并在调试器中进行了双重检查。
- 与上述相关,有一些关于使用 Invoke 与 BeginInvoke 来阻止/不阻止的讨论。在我的情况下,两者都有相同的结果。
- 一些帖子建议有必要在 GUI 线程上自己创建套接字(我的是)。
- 这解释了如果您在应用程序中使用 DoEvents 会出现错误(我没有)。
- 这也意味着在对客户端套接字连接使用异步调用(我的客户端连接是同步的)时,您可能会收到缺少 EndConnect 调用的错误。
- 这解释了如果尚未创建窗口句柄,您可能会从 InvokeRequired 获得不正确的结果(已使用 IsHandleCreated 进行了检查)。
- microsoft connect 上的这个报告了一个类似的错误,但没有解决方案(微软自 2006 年以来一直在“调查”它!)
- 这个包含使用 AsyncOperationManager.SynchronizationContext 备份/恢复同步上下文的建议,这(不出所料?)只会导致不同的错误。
- 有几篇文章表明错误只是调试,以下将使它消失 - 但我没有费心尝试:
System.Windows.Forms.Form.CheckForIllegalCrossThreadCalls = false
还有其他帖子提出了类似的问题:here、here和here。这里也不错。
这是一个代码片段 - 当客户端接收到套接字数据时,这会导致 ProcessCommandCT 崩溃:
我正在使用带有 .NET4 的 VB .NET 2010。
感谢您的帮助 - 我希望上述帖子的综合列表也对其他人有所帮助。
蒂姆
调用堆栈:
wpf - 突出显示搜索文本块
我的目标是创建一个具有新依赖属性 SearchText 的自定义 TextBlock 控件。该属性将包含一个正则表达式。在 TextBlock 的文本中出现的所有此正则表达式都将使用自定义样式(另一个 DP)突出显示。
我当前的实现涉及清除 TextBlock 的 InlineCollection 中的所有 Inline 对象。然后,我用运行未突出显示的文本填充 TextBlock,并运行应用样式的突出显示文本(此方法不支持直接将内联添加到 TextBlock,而是必须使用 TextBlock.TextProperty)。
效果很好,但有时我在尝试清除内联时遇到一个奇怪的异常: InvalidOperationException:“此时无法修改此节点的逻辑子节点,因为正在进行树遍历。”
这个问题似乎与这个有关。我正在修改 TextChanged 函数中的内联,但我使用了一个标志来避免无限递归编辑。
关于如何构建此自定义控件的任何想法?有一个更好的方法吗?我该如何解决这个异常?
谢谢!
c# - 在多线程 WPF 应用程序中创建 LinearGradientBrush 时出现 InvalidOperationException
在static
C# 方法中,我这样做var brush = new LinearGradientBrush(_snazzyGradient);
了,并且这一行引发了异常。 _snazzyGradient
定义如下:
包含方法和_snazzyGradient
实现的类INotifyPropertyChanged
(如果重要),并用作视图模型。使用的静态方法_snazzyGradient
在类的构造函数中被调用。在一个UserControl
类中,我使用引用的构造函数将依赖属性的值设置为该视图模型类的新实例_snazzyGradient
。
当我调试我的应用程序时var brush = new LinearGradientBrush(_snazzyGradient);
,我得到以下异常:
System.InvalidOperationException 被捕获 Message=调用线程无法访问此对象,因为不同的线程拥有它。Source = WindowsBase StackTrace:在 System.Windows.Threading.Dispatcher.VerifyAccess() 在 System.Windows.Threading.DispatcherObject.VerifyAccess() 在 System.Windows.Freezable.ReadPreamble() 在 System.Windows.Media.GradientStopCollection.OnInheritanceContextChangedCore( EventArgs args) 在 System.Windows.DependencyObject.OnInheritanceContextChanged(EventArgs args) 在 System.Windows.Freezable.AddInheritanceContext(DependencyObject 上下文,DependencyProperty 属性) 在 System.Windows.DependencyObject.ProvideSelfAsInheritanceContext(DependencyObject doValue, DependencyProperty dp) 在 System.Windows。依赖对象。
我已经将我的依赖属性更改UserControl
为以下内容:
我的问题是,我怎样才能摆脱这个InvalidOperationException
?Dispatcher
必须在我的视图模型中放置一堆与线程相关的调用似乎是不对的。我不应该将其定义_snazzyGradient
为静态字段,而是从静态方法返回吗?我不知道这是否会有所帮助。我绝对想要多线程,因为我不希望 GUI 在读/写必要的文件时陷入困境,诸如此类。也许我的问题源于在视图模型中使用GradientStop
(继承自DependencyObject
)等;也许这些应该从 my 提供给视图模型的构造函数UserControl
?
wpf - WPF 应用程序中的蓝色 STA 线程异常
我收到异常“调用线程必须是 STA,因为许多 UI 组件都需要这个。” 这很愚蠢,因为正在从 STA 线程中调用给出异常的构造函数!
我真的走投无路了。有没有其他人遇到过这个问题?
c# - C# - BackgroundWorker 不断更新控件:错误!
出于某种原因,我传统上在 C# 中使用 BackgroundWorkers 时遇到了很多麻烦;他们的概念似乎真的难倒我,所以我希望这是一个相当基本的问题,并且可以很容易地纠正......
我有两种使用 .NET 远程处理来回通信的表单。现在,更改 Form1 上的设置会导致 Form2 上的某些内容发生更改,并且效果很好。但是,现在我需要以另一种方式进行相同的工作(更改 Form2 上的某些内容会导致 Form1 更新)并且我不能以相同的方式进行(由于设计限制,我不能让 Form2 发送更改到表格 1)。现在,我正在尝试在 Form1 上使用 BackgroundWorker 来不断调用每个子控件(放置在 Form1 上)上的“Update()”方法。这些控件中的每一个都具有从 Form2 获取其等效设置的当前状态并更新自身的方法(这很有效;已经看到“Update()”方法正在处理 Form1 的初始化)。
这就是我的问题出现的地方。我不确定如何让 BackgroundWorker 在每个表单上不断调用“Update()”,所以在我的“DoWork()”方法中,我有一个“while(true)”循环,并且在其中 BackgroundWorker 调用了“Update() ()' 方法,然后休眠很短的时间,然后重复。
这样做,我得到一个“InvalidOperationException 未被用户代码处理”错误,详细说明“跨线程操作无效:控制'comboBox_BGColor'从创建它的线程以外的线程访问。” 现在,我基本上知道这意味着什么,并且我理解它发生的原因,但是,我不确定该怎么做或如何改变事情以使其按预期工作。有人对此或我使用 BackgroundWorker 的方式有任何提示吗?非常感谢您提供任何信息并花时间阅读本文!
c# - 如何使用 RhinoMocks 断言具有三种不同类型的泛型方法?
我正在尝试学习 Rhino Mocks AAA 语法,但在断言某个方法(带有任何参数值)被调用时遇到了麻烦。我使用 Machine.Specifications 作为我的测试框架。
这个特定的方法是通用的,我想确保它被三种不同的类型调用了三次。
我为每种类型的函数存根。但我得到了一个有趣的结果。(以下)
结果是两个例外和一个通过。
第一个调用抛出:
System.InvalidOperationException:没有设置要验证的期望,确保操作中的方法调用是虚拟(C#)/可覆盖(VB.Net)方法调用
第二个抛出:
System.InvalidOperationException:录制时仅在模拟方法调用中使用 Arg。预期 1 个参数,已定义 2 个。
第三个通过了……出于某种奇怪的原因。
我还尝试在我的设置中将 GenerateMock() 与 Expect 结合使用,以及将 GenerateStub() 与 Stub 结合使用。两者都得到了完全相同的结果。我一定是做错了什么。
我正在使用:MachineSpec 0.3.0.0 和 RhinoMocks 3.6.0.0
有任何想法吗?
- - -固定的 - - - - -
这是在 Lee 的帮助下的完整(工作版本)。我正在使用一个额外的(非 linq)层。我的实际问题是我的一项测试在离线真实代码中重新使用了错误的 lambda 变量。它应该做某事 = () => repo.AssertWasCalled( o => repo .Save(data)); //错误的lambda
所以这里有一个正确测试的样本供参考。
vb.net - VB.net ApplicationFramework 加 SplashScreen:InvalidOperationException
我最近将我的应用程序从使用自定义 SplashScreen(它只是一个带有 Timer 的表单加载了主表单并自行关闭)更改为 Application Framework。
这是我所做的:
- 创建了一个新的 SplashScreenForm 来显示应用程序版本等。
- 在以下位置选择该表单:我的项目 -> 应用程序 -> SplashScreen
- 将长时间运行的初始化代码从主窗体的构造函数移至 ApplicationEvents 启动事件
这完全符合我的要求。SplashScreen 首先出现,然后 Startup Event 触发并起作用。SplashScreen 关闭并显示实际的主窗体。
到现在为止还挺好。但是我们的客户有时会在启动过程中遇到这个讨厌的异常:
在 HideSplashScreen() 期间似乎有一个错误,但问题是整个堆栈超出了我的控制范围,所以我不能只捕获这个异常。
有什么建议么?