c# – SynchronizationContext Send()应该是同一个线程吗?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – SynchronizationContext Send()应该是同一个线程吗?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1687字,纯文字阅读大概需要3分钟。
内容图文
![c# – SynchronizationContext Send()应该是同一个线程吗?](/upload/InfoBanner/zyjiaocheng/757/5f3a9442a03841189605fb54a227053a.jpg)
我有这种情况,我尝试在创建的同一个线程上处理事件.这通常在UiThread中完成,但我不是在UiThread上开始.我有一些测试基本上有以下步骤.我遗漏了一些细节.我不确定这是否应该按照我认为的那样行事.
首先,我检查当前线程的Id
var myThreadId = Thread.CurrentThread.ManagedThreadId;
我创建了一个SynchronizationContext,并设置为当前
var _context = new SynchronizationContext();
SynchronizationContext.SetSynchronizationContext(_context);
然后我发送一些动作到上下文(我们现在在另一个线程)
_context.Send(x => _action(sender, e), null);
在这个动作中,我再次检查ThreadId
Assert.Equal(myThreadId, Thread.CurrentThread.ManagedThreadId);
这失败了.我不应该再次使用原始帖子吗?
解决方法:
创建新的SynchronizationContext并使用Send或Post与同步委托调用完全相同,就像您自己完成一样.代码相当简单(取自the source):
public virtual void Send(SendOrPostCallback d, Object state)
{
d(state);
}
您正试图模仿自定义上下文的操作,例如DispatcherSynchronizationContext,它知道WPF的UI消息循环线程.这种行为不会发生在这里.
如果您来自UI线程,则需要捕获上下文并将其传递.
您可以在DispatcherSynchronizationContext中更清楚地看到这一点,使用Dispatcher类将哪些队列工作到UI:
/// <summary>
/// Synchronously invoke the callback in the SynchronizationContext.
/// </summary>
public override void Send(SendOrPostCallback d, Object state)
{
// Call the Invoke overload that preserves the behavior of passing
// exceptions to Dispatcher.UnhandledException.
if(BaseCompatibilityPreferences.GetInlineDispatcherSynchronizationContextSend() &&
_dispatcher.CheckAccess())
{
// Same-thread, use send priority to avoid any reentrancy.
_dispatcher.Invoke(DispatcherPriority.Send, d, state);
}
else
{
// Cross-thread, use the cached priority.
_dispatcher.Invoke(_priority, d, state);
}
}
内容总结
以上是互联网集市为您收集整理的c# – SynchronizationContext Send()应该是同一个线程吗?全部内容,希望文章能够帮你解决c# – SynchronizationContext Send()应该是同一个线程吗?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。