Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# DateTime相等和声明导致ContextSwitchDeadlock_C#_Datetime_Declaration - Fatal编程技术网

C# DateTime相等和声明导致ContextSwitchDeadlock

C# DateTime相等和声明导致ContextSwitchDeadlock,c#,datetime,declaration,C#,Datetime,Declaration,我认为这是一个愚蠢的问题,但当我发现自己无法做到以下几点时,我感到有点奇怪: EditingItem.FROM = EditingItem.TO = DateTime.Now; // FROM, TO are DateTime 在这种操作之后,程序有时会挂起,但有时它只是按照我的想法工作。 例外情况如下: 检测到ContextSwitchDeadlock消息:CLR无法 60从COM上下文0x478b80转换到COM上下文0x478dd0 秒。拥有目标上下文/单元的线程是 很可能是执

我认为这是一个愚蠢的问题,但当我发现自己无法做到以下几点时,我感到有点奇怪:

EditingItem.FROM = EditingItem.TO = DateTime.Now;   // FROM, TO are DateTime   
在这种操作之后,程序有时会挂起,但有时它只是按照我的想法工作。
例外情况如下:

检测到ContextSwitchDeadlock消息:CLR无法 60从COM上下文0x478b80转换到COM上下文0x478dd0 秒。拥有目标上下文/单元的线程是 很可能是执行非泵送等待或处理很长的时间 运行操作而不泵送Windows消息。这种情况 通常会对性能产生负面影响,甚至可能导致 应用程序变得无响应或内存使用量累积 随着时间的推移。为避免此问题,所有单线程 单元(STA)线程应该使用泵送等待原语(例如 CoWaitForMultipleHandles)并在长时间内定期泵送消息 运行操作

将代码更改为:

  EditingItem.FROM = DateTime.Now;
  EditingItem.TO = DateTime.Now;
这对我的处境很有帮助

无法正确地搜索问题,以查看解释,那么您可以帮助并解释whis表达式错误的原因吗?
PS更多评论中的讨论。 以下是一些实验结果:

DateTime d = DateTime.Now;
EditingItem.FROM = EditingItem.TO = d;//hang
增加了定时循环:

for (int i = 0; i < 100000; i++)
{
   i++;
}

DateTime d = DateTime.Now;
EditingItem.FROM = EditingItem.TO = d;//hang
for(int i=0;i<100000;i++)
{
i++;
}
DateTime d=DateTime.Now;
EditingItem.FROM=EditingItem.TO=d//悬挂

您的代码相当于以下代码:

var temp = DateTime.Now;
EditingItem.TO = temp;
EditingItem.FROM = temp;
把作业放在一行只是一个简写,也许可以显示C#的C语言根

现在您已经提供了有关问题的更多信息,您的程序似乎因为COM死锁而挂起。很难看出
DateTime
值的赋值会导致死锁。异常表示CLR正在尝试调用STA(单线程单元)中的COM对象,该STA未处理其消息泵

我只是想描述一种可能的情况,但了解您问题的具体情况后,我可能会大错特错:

假设您的用户界面中有一个响应事件(例如单击)的基于COM的控件。在事件处理程序中,启动后台线程,然后事件处理程序等待该线程完成或设置后台任务完成的信号。后台任务(在另一个线程上运行)然后尝试获取COM对象的属性。这将触发一个死锁,就像您正在经历的死锁一样

在COM控件以外的其他单元中运行的后台线程必须封送对COM控件单元(STA)的调用。这是通过向COM使用的隐藏窗口发送windows消息来完成的。但是,应该分派该windows消息的线程当前被阻止,等待后台线程完成。后台线程正在等待用户界面线程分派windows消息。这是一个僵局


为了避免这种情况,请不要阻塞用户界面线程,或者如果您必须至少确保在等待时泵送消息。异常消息中会提示如何执行此操作。

您的代码相当于以下代码:

var temp = DateTime.Now;
EditingItem.TO = temp;
EditingItem.FROM = temp;
把作业放在一行只是一个简写,也许可以显示C#的C语言根

现在您已经提供了有关问题的更多信息,您的程序似乎因为COM死锁而挂起。很难看出
DateTime
值的赋值会导致死锁。异常表示CLR正在尝试调用STA(单线程单元)中的COM对象,该STA未处理其消息泵

我只是想描述一种可能的情况,但了解您问题的具体情况后,我可能会大错特错:

假设您的用户界面中有一个响应事件(例如单击)的基于COM的控件。在事件处理程序中,启动后台线程,然后事件处理程序等待该线程完成或设置后台任务完成的信号。后台任务(在另一个线程上运行)然后尝试获取COM对象的属性。这将触发一个死锁,就像您正在经历的死锁一样

在COM控件以外的其他单元中运行的后台线程必须封送对COM控件单元(STA)的调用。这是通过向COM使用的隐藏窗口发送windows消息来完成的。但是,应该分派该windows消息的线程当前被阻止,等待后台线程完成。后台线程正在等待用户界面线程分派windows消息。这是一个僵局


为了避免这种情况,请不要阻塞用户界面线程,或者如果您必须至少确保在等待时泵送消息。异常消息中暗示了这是如何实现的。

您的问题是似乎发生了
锁定
再次发生,代码未提供,因此只是猜测-对象锁定在何处,因此从另一个属性分配属性将在其自身上死锁


如果您处理的是COM,COM对象是单线程单元对象这一事实可以证明这一点。

您的问题是,似乎发生了
锁定
的情况-同样没有提供代码,所以只是猜测-对象被锁定的位置,因此从另一个属性分配属性将在自身上发生死锁


如果您处理的是COM,可以通过COM对象是单线程单元对象这一事实来证明这一点。

与日期时间无关。如果挂起,则会发生问题中未提供的某些线程同步。@Aliostad,请认为您是对的。我加了一个例外。但是如果它与线程有关,为什么它总是挂在这条线上?你能解释一下我是如何使用COM的吗