- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个在第三方沙箱内的 STA 线程下运行的程序集,在这个线程中我创建了一个双工 WCF 客户端,它需要在原始 STA 线程上执行方法。
当前的实现工作正常,在 Duplex 回调中,我按如下方式获取 STA 线程的同步上下文,并使用它回发到 STA 线程:
private readonly SynchronizationContext _syncContext = AsyncOperationManager.SynchronizationContext;
这一切都在 STA 线程中初始化的 WinForm 中运行,很好...但是我需要移动 WCF 双工代理,以便它在主 STA 线程中的类实例下运行。当我删除 winform 时,我最终从上面的 SynchronizationContext 获得了一个全新的线程。
澄清一下:
Winforms:-
没有 WinForm(类实例):-
在线程 11 而不是 1 上执行意味着我的方法无法在沙箱内正确执行,除了在 winform 下运行的变体之外,变体之间的代码没有区别。有谁知道我如何在不使用 winform 的情况下在主 STA 线程中保持双工回调方法的执行?
最佳答案
您正在使用 AsyncOperationManager.SynchronizationContext
属性获取同步上下文。该属性在后台使用 SynchronizationContext.Current
。
这意味着,获得的 SynchronizationContext
取决于您访问该属性的环境:
如您所见in the docs :
The default implementation is the free-threaded implementation.
因此,如果未设置当前线程的同步上下文,您将获得一个默认的自由线程 SynchronizationContext
实例。它将通过在调用者线程上同步执行来Send
回调并将Post
回调发送到ThreadPool
(因此“随机”工作线程将拾取它们)。
在 Windows 窗体应用程序中,主线程的 SynchronizationContext
将被初始化为一个 WindowsFormsSynchronizationContext
实例。该实例会将回调发布
到主 UI 线程。
在 WPF 应用程序中,这将是一个 DispatcherSynchronizationContext
。
在控制台应用程序中,主线程不会有 SynchronizationContext
。因此,我上面提到的自由线程选项开始生效,因此您将获得一个发布到 ThreadPool
的自由线程 SynchronizationContext
实例。这几乎可以解释您观察到的行为。
如果您需要同步,您可以为您的控制台应用程序的主线程实现您自己的线程仿射 SynchronizationContext
。但这并不容易。在控制台应用程序中,您没有消息循环,也没有可以管理回调队列的调度程序。你可以看看这个great answer由 Stephen Cleary 提出的异步 SynchronizationContext
的想法。不过,您需要手动创建一个“主循环”。
关于c# - STA 线程在 Winforms 中使用,但在作为控制台应用程序执行时不使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55186575/
我必须将.NET应用程序作为插件包含到另一个.NET应用程序中。插件界面要求我从模板表单继承。然后,在加载插件时,将表单附加到MDI中。 到目前为止,一切正常,但是每当我注册拖放事件时,都为组合框设置
我有一个必须作为 STA 运行的函数,我想将它的异常传播到调用线程。在这里: public void ExceptionBePropagatedThroughHere() { Thread thr
我正在将一个线程初始化为静态线程,如下所示 Thread GenerateKeywords; private void btnStart_Click(object sender, EventArgs
我们正在 AZURE 上开发“ Multi-Tenancy 应用程序” (MTA)。此外,我们为通过 REST API 端点利用 MTA 数据的客户开发“单租户应用程序”(STA),即可以在任何地方托
我从 GUI 线程调用这个函数: let updateImageLoop (pprocess : PlotProcess) (target : IUpdatableImageView) = a
我有一个类,当某些操作的状态发生变化时,它应该向用户显示一些消息,如下所示: public static class AutoUpdater { public static a
我有一个 BackgroundWorker 调用函数在 BackgroundWorker _DoWork 做一个长进程,当函数发生错误时我会提示一个自定义的消息框: WPFMessageBoxRes
我一直在尝试一些最终可能变成不可能的事情。自从我进入 COM 领域以来已经有很长一段时间了。 考虑两个应用程序和一个 COM STA DLL。第一个应用程序将 COM STA DLL 作为插件加载,此
这个问题在这里已经有了答案: How to create a task (TPL) running a STA thread? (2 个答案) 关闭 8 年前。 我正在 VS2010 中开发 VST
我正在尝试创建 COM 组件,它会经常被 excel 应用程序调用(excel 将在其初始化时加载 COM)并且另一个进程(比如 procA)也会(以高频率)发送 windows 消息到这个组件。目前
所以,关注 this ,我决定在专用 STA 线程上显式实例化一个 COM 对象。实验表明 COM 对象需要一个消息泵,这是我通过调用 Application.Run() 创建的: private M
我有这个遗留的第三方 COM DLL。我将其注册到注册表并将 RCW 添加到我的 .NET/C# 控制台应用程序。注册表将 COM 的线程模型 显示为单元。我的应用程序的全部目的是使用多线程并发提交多
我有一个小的 c# 类需要公开为 COM。将使用 COM 对象的工具要求我支持 STA。我需要对 COM 对象做些什么特别的事情吗? (我知道 STAThread 属性,但是(除非我错了)它用于指示
在我的 WPF 应用程序中,我进行了一些异步通信(与服务器)。在回调函数中,我最终根据服务器的结果创建了 InkPresenter 对象。这要求正在运行的线程是 STA,而目前显然不是。因此我得到以下
如果我在 .NET 中有一个 STA 线程,并且我在该线程中创建了一个 STA COM 对象,然后该线程结束——这是否会杀死该对象的实例? 我的理解是否正确,STA COM 对象可以被多个线程访问并且
我正在 PowerShell 中处理 GUI,当单击某些组合框时我会抛出错误。 抛出错误后,我可以放下组合框列表并查看其内容,但是如果我切换到同一个 datagridview 上的另一个组合框,我会在
在过去的几个月中,我一直在尝试使用Powershell(2.0),并且很乐意使用它来对一些正在使用的进程进行现代化和标准化-大多是基于DOS的进程。由于工作的性质,一次执行大约100次相同脚本的执行。
谁能解释一下 LDA、ROL、STA 给出的每条指令的确切结果是什么? C=1 (carry flag is 1) LDA A #$08 0008 | 01 ROL A 0009 | 02
我是一名硕士生,我正在通过 STATISTICA 程序学习统计学类(class)。我对 R 比较熟悉,并想坚持下去。所以我打算在 R 中做提供的练习。但是要使用的数据格式为 *.sta... 有没有办
我试图让 Watin 在我的 SSIS 脚本任务中工作,通过在新线程中打开 IE 来执行一些自动化操作,做一些事情,找到最终值并基本上在父线程中返回/设置该值。 所以我现在有这个: public pa
我是一名优秀的程序员,十分优秀!