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

news/2024/12/18 16:35:27/

在这里插入图片描述

C# DragDrop 注册失败

System.InvalidOperationExceptionHResult=0x80131509Message=DragDrop 注册失败。Source=System.Windows.FormsStackTrace:在 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()}");

在这里插入图片描述


http://www.ppmy.cn/news/1556160.html

相关文章

网络隧道与代理

文章目录 网络隧道网络代理参考 网络隧道 使用隧道的原因是在不兼容的网络上传输数据&#xff0c;或在不安全网络上提供一个安全路径。网络隧道的一个典型特征就是封装报文和对报文加密。如下是两个典型的案例&#xff1a;IPv4到IPv6的迁移、VPN。 图3.1 IPv4到IPv6的迁移 图…

异步线程使用

创建线程的几种方法&#xff1a; 执行完整个main方法&#xff0c;在后台慢慢打印。 1.2.3方式都不能获得控制资源。 4、 线程池方法&#xff0c;每个异步任务&#xff0c;提交给线程池让他自己去执行就行。 1、降低资源的消耗 通过重复利用已经创建好的线程降低线程的创建和…

【python面向对象】304-面向对象三大特性-3.多态

三种特性&#xff1a; 封装性&#xff1a; 私有属性和私有方法把属性和方法隐藏起来&#xff0c;属性没有特殊要求都用私有属性意义&#xff1a; 以面向对象的编程思想进行项目开发封装数据属性&#xff1a;明确的区分内外&#xff0c;控制外部对隐藏的属性的操作行为(保护数据…

泷羽Sec学习笔记-zmap搭建炮台

zmap搭建炮台 zmap扫描环境&#xff1a;kali-linux 先更新软件库 sudo apt update 下载zmap sudo apt install zmap 开始扫描(需要root权限) sudo zmap -p 80 -o raw_ips.txt 代码解析&#xff1a; sudo&#xff1a;以超级用户&#xff08;管理员&#xff09;权限运行…

Zookeeper其二,zk的java和选举机制,Hadoop的高可用和联邦机制

目录 一、Zk是用java代码进行操作&#xff08;了解&#xff09; 使用java代码操作zk 3.5以下版本&#xff0c;使用的技术还是Curator 二、zk的选举机制 三、Hadoop集群的高可用&#xff08;HA&#xff09; 1&#xff09; 搭建namenode的高可用 Java 代码操作 HA 的 hdfs 代…

dolphinscheduler服务RPC框架源码解析(五)RPC提供者服务调用真实方法实现

RPC服务提供者的设计实现 1.概述2.RPC提供者服务调用真实方法设计3.RPC服务提供者调用真实方法实现3.1.工程结构3.1.RPC提供者服务调用真实方法入口类JdkDynamicServerHandler3.2. ServerMethodInvokerImpl类反射方法调用4.总结1.概述 上一篇文章我们已经看过了RPC提供者服务的…

MybatisPlus--mybatis升级版

一、快速入门 1.引入MybatisPlus的起步依赖 mybatisPlus官方提供了starter。其中集成了Mybatis和MybatisPlus的所有功能&#xff0c;对mybatis实现了润物无声&#xff0c;并且实现了自动装配效果。 因此使用了Mybatis的项目&#xff0c;也可以使用MybatisPlus的starter代替M…

我们来对接蓝凌OA --报文格式

题记 数智化办公专家、国家高新技术企业、知识管理国家标准制定者、信创供应商10强…等等&#xff0c;这些和咱们有关系吗&#xff01;&#xff01;不好意思&#xff0c;走错片场了&#xff0c;刚和项目经理在甲方那边吹牛B想想刚刚的大饼&#xff0c;看看支付宝余额&#xff…