相关疑难解决方法(0)

ThreadAbortException

假设我们在单独的线程中运行了一些这样的代码:

private static void ThreadFunc() {
    ulong counter = 0;

    while (true) {

        try {
            Console.WriteLine( "{0}", counter++ );
        }
        catch (ThreadAbortException) {
            Console.WriteLine( "Abort!" );
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

Thread.Abort()被调用时,是有可能的异常catch块之外抛出?

.net c#

43
推荐指数
3
解决办法
5万
查看次数

MTA控制台应用程序从多个线程调用STA COM对象

虽然有很多关于COM和STA/MTA的问题(例如这里),但大多数人都在讨论具有UI的应用程序.但是,我有以下设置:

  • 控制台应用程序,默认情况下为Multi-Threaded Apartment(Main()显式具有该[MTAThread]属性).
  • 主线程产生一些工作线程.
  • 主线程实例化单线程COM对象.
  • 主线程调用Console.ReadLine(),直到用户点击'q',然后应用程序终止.

几个问题:

  • 许多地方都提到需要为COM对象提供消息泵.我是否需要为主线程手动创建消息泵,或者CLR是否会在新的STA线程上为我创建消息泵,正如这个问题所暗示的那样?
  • 只是为了确保 - 假设CLR自动创建必要的管道,然后我可以使用来自任何工作线程的COM对象而无需显式同步吗?
  • 在性能方面,以下哪项更好:
    • 让CLR负责处理COM对象的编组.
    • 在单独的STA线程上显式实例化对象,并让其他线程通过例如a与之通信ConcurrentQueue.

c# mta com-interop sta

11
推荐指数
3
解决办法
3804
查看次数

C# 控制台应用程序 + 事件处理

大家好。我正在尝试了解如何在控制台应用程序中处理事件。我宁愿不使用静默的 WinForms(尽管我明白这是一种方法)来做到这一点。我已经阅读了一个类似的问题及其回应。请参阅下面的回复文本(链接):

STA 线程的基本要求是它需要运行消息泵。在 Windows 窗体中,您可以使用 Application.Run。或者您可以使用 user32!GetMessage 和 DispatchMessage 手动编写消息泵。但是在 WinForms 或 WPF 中使用它可能更容易。

使用“user32 -> GetMessage”和“user32 -> DispatchMessage”的程序的基本结构是什么?

c# console-application event-handling

6
推荐指数
1
解决办法
2万
查看次数

标签 统计

c# ×3

.net ×1

com-interop ×1

console-application ×1

event-handling ×1

mta ×1

sta ×1