immaculate C# DragDrop 注册失败 解决 C#窗口程序如何看控制台打印的日志

在这里插入图片描述

C# DragDrop 注册失败

System.InvalidOperationException
  HResult=0x80131509
  Message=DragDrop 注册失败。
  Source=System.Windows.Forms
  StackTrace:
   在 System.Windows.Forms.Control.SetAcceptDrops(Boolean accept)
   在 System.Windows.Forms.Control.OnHandleCreated(EventArgs e)
   在 System.Windows.Forms.Form.OnHandleCreated(EventArgs e)
   在 System.Windows.Forms.Control.WmCreate(Message& m)
   在 System.Windows.Forms.Control.WndProc(Message& m)
   在 System.Windows.Forms.Form.WmCreate(Message& m)
   在 System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

  此异常最初是在此调用堆栈中引发的: 
    System.Windows.Forms.Control.SetAcceptDrops(bool)

内部异常 1:
ThreadStateException: 在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式。请确保您的 Main 函数带有 STAThreadAttribute 标记。

在这里插入图片描述
查看状态,看是从哪里由STA变成了MTA

Thread.CurrentThread.GetApartmentState()

修改后
在这里插入图片描述

static async Task Main(string[] args) 的原因是因为 async Task Main 的默认线程模式是多线程单元(MTA),而 DragDrop 功能需要单线程单元(STA)。async Task Main 是 C# 支持异步主方法的新特性,但它不能直接与 [STAThread] 一起使用。

以下是解决这个问题的几种方法:


解决方法 1: 使用同步 Main 方法作为入口点

Main 方法改为同步方法,同时在同步方法中调用异步方法并等待完成。

修改代码:
[STAThread]
static void Main(string[] args)
{
    MainAsync(args).GetAwaiter().GetResult();
}

static async Task MainAsync(string[] args)
{
    // 异步逻辑
    await Task.Delay(1000);
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new MainForm());
}

这种方法保留了异步逻辑的灵活性,同时确保线程是 STA 模式。


解决方法 2: 创建 STA 线程运行 Application.Run

如果必须保留 async Task Main 作为入口,可以在 Main 方法中创建一个 STA 线程来运行 Application.Run

修改代码:
static async Task Main(string[] args)
{
    // 异步逻辑
    await Task.Delay(1000);

    var staThread = new Thread(() =>
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new MainForm());
    });

    staThread.SetApartmentState(ApartmentState.STA); // 设置线程为 STA 模式
    staThread.Start();
    staThread.Join(); // 等待线程完成
}

这种方法将所有需要 STA 模式的代码放在单独的线程中执行。


解决方法 3: 弃用 async Task Main,改为异步控制流程

如果 async Task Main 不是必须的,可以直接使用同步代码控制应用的启动过程。

修改代码:
[STAThread]
static void Main(string[] args)
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);

    // 异步调用并等待完成
    var result = RunAsyncLogic().GetAwaiter().GetResult();

    Application.Run(new MainForm());
}

static async Task<int> RunAsyncLogic()
{
    await Task.Delay(1000); // 模拟异步操作
    return 0;
}

这种方式让 Main 保持同步,异步逻辑分离到单独的方法中。


总结

  • 如果需要支持异步逻辑且要保持线程 STA 模式,解决方法 1 是最优选择,兼顾异步灵活性和 DragDrop 的要求。
  • 如果必须使用 async Task Main,可以采用 解决方法 2,在 STA 线程中运行 Windows 窗体或 WPF 相关代码。

C#窗口程序如何看控制台打印的日志

这样输出日志就能看见了。
在这里插入图片描述

 Console.WriteLine($"Main Thread ApartmentState: {Thread.CurrentThread.GetApartmentState()}");

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/938108.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

怎样衡量电阻负载的好坏

电阻负载的好坏通常通过以下几种方法来衡量&#xff1a; 1. 测量电阻值&#xff1a;最直接的方法是使用万用表来测量电阻负载的电阻值。将万用表设置在适当的电阻档位&#xff0c;然后将测试笔连接到电阻负载的两个引脚上。如果电阻负载是好的&#xff0c;那么万用表应该显示一…

酒蒙子骰子小程序系统

酒蒙子流量变现小程序小游戏 后端tp8 前端uniapp 会员变现 分销推广 流量主 …

Spring Boot 3.x:自动配置类加载机制的变化

随着 Spring Boot 3.x 版本的发布&#xff0c;Spring Boot 引入了一些关键的变更。其中最重要的一项变更是 自动配置类的加载机制。在之前的版本中&#xff0c;Spring Boot 使用 spring.factories 文件来管理自动配置类的加载。然而&#xff0c;在 Spring Boot 3.x 中&#xff…

网络安全学习路线

《网络安全自学教程》 网络安全这几年改成了网络空间安全&#xff0c;因为网络空间也是国家主权之一&#xff0c;网络空间不安全&#xff0c;你就要在别人眼皮子底下裸奔&#xff0c;当然&#xff0c;非洲的小伙伴就不用担心受到威胁&#xff0c;毕竟他们连网都没有。 网络安全…

【Linux网络编程】第十一弹---HTTP协议全解析:从请求响应到方法与Header的详尽指南

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】【Linux网络编程】 目录 1、HTTP 协议 1.1、认识 URL ​1.2、urlencode 和 urldecode 1.3、HTTP 协议请求与响应格式 1.3.1、代码…

从 Router 到 Navigation:HarmonyOS 路由框架的全面升级与迁移指南

在本教程中&#xff0c;我们深入探讨了 Router 和 Navigation 在 HarmonyOS 中的用法差异及如何从 Router 切换到 Navigation 的方法。重点涵盖了页面跳转、转场动画、生命周期管理以及跨包路由的实现。 页面结构对比 Router 页面结构 每个页面需要使用 Entry 注解。 页面需要…

账号下的用户列表表格分析

好的&#xff0c;这是您提供的 el-table 组件中所有列的字段信息&#xff0c;以表格形式展示&#xff1a; 列标题 (label)字段属性 (prop)对齐方式 (align)宽度 (width)是否可排序 (sortable)说明IDidcenter100否管理员的唯一标识符头像avatarcenter90否管理员的头像 URL 或路…

luckysheet与superslide冲突解决

[现象]控制台报错、界面无法操作 $是jquery。查看源码&#xff0c;发现mousewheel方法来自插件mousewheel&#xff0c;luckysheet初始应该会将mousewheel挂载在jquery上。 在控制台打印jquery取dom及其方法&#xff0c;结果如下&#xff1a; 不存在mousewheel方法&#xff0c…

windows使用python写的YOLO来实现目标识别

使用labelImg标注&#xff0c;YOLO进行目标训练 一、labelImg工具下载及使用1、下载labelImg&#xff08;目标标注工具[【点我下载】](https://github.com/HumanSignal/labelImg)&#xff09;2、使用labelImg 二、下载及使用YOLO1、下载及使用ultralytics&#xff08;volo[点击…

Java——多线程(上)

一 (线程的介绍) 1 多线程的基本概念 (每个进程由三部分构成——>CPU&#xff0c;Data&#xff0c;Code&#xff0c;进程之间完全独立&#xff0c;内存隔离) (运行在进程内的&#xff0c;一个进程可以包含多个线程&#xff0c;线程之间是可以并行的&#xff0c;并且共享相…

SpringBoot3+graalvm:整合并打包为可执行文件

原文网址&#xff1a;SpringBoot3graalvm&#xff1a;整合并打包为可执行文件-CSDN博客 简介 本文介绍SpringBoot3如何整合graalvm&#xff0c;并打包为可执行文件。Windows和Linux都打包。 版本 springboot3.3.6 graalvm21&#xff08;包含JDK21&#xff08;21是最新的LT…

【Bolt.new + PromptCoder】三分钟还原油管主页

【Bolt.new PromptCoder】三分钟还原油管主页 PromptCoder官网&#xff1a;PromptCoder Bolt官网&#xff1a;https://bolt.new/ Bolt 是什么&#xff1f; Bolt.new 是一个提供创建全栈网络应用服务的平台。它允许用户通过提示&#xff08;Prompt&#xff09;、运行&#x…

ubuntu下anconda装pytorch

1、禁用nouveau sudo vim /etc/modprobe.d/blacklist.conf 在文件最后部分插入以下两行内容 blacklist nouveau options nouveau modeset0 更新系统 sudo update-initramfs -u 重启系统 2、装nvidia驱动 卸载原来驱动 sudo apt-get remove nvidia-* &#xff08;若安装…

QT数据库(四):QSqlRelationalTableModel 类

关系数据库概念 例如下列departments、majors、studInfo 这 3 个数据表之间存在关系。 主键与外键 标记“**”的是主键字段&#xff0c;标记“*”的是外键字段。主键字段是一个数据表中表示记录唯一性的字段&#xff0c;例如 studInfo 数据表中的 studID 字段。外键字段是与其…

【Linux】-学习笔记10

第八章、Linux下的火墙管理及优化 1.什么是防火墙 从功能角度来讲 防火墙是位于内部网和外部网之间的屏障&#xff0c;它按照系统管理员预先定义好的规则来控制数据包的进出 从功能实现角度来讲 火墙是系统内核上的一个模块netfilter(数据包过滤机制) …

SpringBoot 手动实现动态切换数据源 DynamicSource (中)

大家好&#xff0c;我是此林。 SpringBoot 手动实现动态切换数据源 DynamicSource &#xff08;上&#xff09;-CSDN博客 在上一篇博客中&#xff0c;我带大家手动实现了一个简易版的数据源切换实现&#xff0c;方便大家理解数据源切换的原理。今天我们来介绍一个开源的数据源…

Crawl4AI:一个为大型语言模型(LLM)和AI应用设计的网页爬虫和数据提取工具实战

这里写目录标题 一、crawl4AI功能及简介1、简介2、特性 二、项目地址三、环境安装四、大模型申请五、代码示例1.生成markdown2.结构化数据 一、crawl4AI功能及简介 1、简介 Crawl4AI 是一个开源的网页爬虫和数据抓取工具&#xff0c;一个python项目&#xff0c;主要为大型语言…

【银河麒麟高级服务器操作系统】有关dd及cp测试差异的现象分析详解

了解更多银河麒麟操作系统全新产品&#xff0c;请点击访问 麒麟软件产品专区&#xff1a;https://product.kylinos.cn 开发者专区&#xff1a;https://developer.kylinos.cn 文档中心&#xff1a;https://documentkylinos.cn dd现象 使用银河麒麟高级服务器操作系统执行两次…

sqli-labs靶场第26-30关

第26关 这关将逻辑运算符&#xff0c;注释符以及空格给过滤了 我们先使用单引号进行闭合 这时我们查看源代码可以看到这一关过滤了很多字符 可以看到这里将or and / -- # 空格等字符都被注释了 空格被过滤了我们可以使用()来代替&#xff0c;and和or可以使用双写来绕过 因为…

ik分词器了解 和 通过zip安装包的方式 将ik分词器安装到elasticsearch中

目录 1. ik分词器的作用&#xff08;效果&#xff09; &#xff08;1&#xff09;标准分析器效果 &#xff08;2&#xff09;ik_smart分词 &#xff08;3&#xff09;ik_max_word分词 2. 首先根据自己的elasticsearch的版本下载对应的ik分词器版本 3. 将下载好的ik分词器…