【问题标题】:AccessViolationException in C# multithreaded formC# 多线程形式的 AccessViolationException
【发布时间】:2014-01-31 19:33:53
【问题描述】:

首先这是我的第一个 C# 项目。我已经在这个项目上工作了大约 6 个月。

我们有一个 winforms 程序,它包含一个日志记录 GUI。为了让程序的其余部分保持响应,我想在一个单独的线程上创建日志 gui,因为当有很多事情发生时它会非常密集。

这就是我尝试在新的 GUI 线程上打开表单的方式。一般来说,它可以工作并保持主 gui 响应。但是,当它被激活时,我们现在随机得到一个 AccessViolationException (http://pastebin.com/7tLtBSei),我不知所措。

var thread = new Thread(() =>
{
    loggingForm = new LoggingForm(Logger.path);
    Application.Run(loggingForm);
});
thread.Name = "LoggingFormGUIThread";
thread.Start();

日志 GUI 只是批量读取日志文件并将其附加到 RichTextBox。它不涉及任何托管代码。

【问题讨论】:

    标签: c# .net multithreading winforms access-violation


    【解决方案1】:

    您需要将线程的单元状态设置为 STA。

    thread.SetApartmentState(ApartmentState.STA);
    thread.Name = "LoggingFormGUIThread";
    thread.Start();
    

    这是许多用户界面组件(例如RichTextBox)正常运行所必需的。

    【讨论】:

    • 感谢您提供快速而有帮助的答案。这似乎解决了这个问题。不过,我还没有完全理解为什么需要这样做。
    • @DrWu 许多 UI 元素在下面使用 COM,这是 COM 对象正常运行所必需的。通常,您需要始终使 UI 线程 STA。
    • 我在这里找到了原因stackoverflow.com/questions/4154429/apartmentstate-for-dummies 再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-05
    • 2011-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多