在 ASP.NET 中将线程设置为 STA
Posted
技术标签:
【中文标题】在 ASP.NET 中将线程设置为 STA【英文标题】:Setting thread to STA when in ASP.NET 【发布时间】:2015-04-11 04:03:03 【问题描述】:我正在尝试将副本复制到我的 .ascx 文件中的剪贴板。由于这是 ASP.NET,所以没有将 [STAThread] 放在上面的 main 函数。
我收到一条错误消息:“在进行 OLE 调用之前,必须将当前线程设置为单线程单元 (STA) 模式。确保您的 Main 函数上标记了 STAThreadAttribute。”
在我的 ascx.cs 文件中,我有using System.Windows.Forms;
,然后是一行代码Clipboard.SetText("Hello, clipboard");
我试图找到一个解决方案,但大多数解决方案都假设有一个主要的,或者说要删除 dll。这些解决方案不适合我的情况。
【问题讨论】:
我不是 100% 确定,但仍然有理由确定您不能将 ASP.NET 工作线程更改为 STA。无论如何,一旦线程运行,就无法更改公寓模式。但是你总是可以开始一个新的 STAThread
;并在你.Start()
它之前将其公寓模式设置为STA;并在该线程上执行使用 OLE 的代码。
那我该怎么做呢?在我使用Clipboard.SetText
之前,我是否调用了 STAThreadAttribute?在这种情况下,我应该把 .Start() 放在哪里?
stakx 是我将如何处理这个 STA 问题的方法,我认为我将创建一个新线程。我不确定您如何控制 IIS 进程中的第一个 CoCreate 线程,以便最终获得您。 但是我无法想象在任何情况下我会使用剪贴板在多线程服务应用程序(如 IIS)中的线程之间进行复制。您将有多个线程读取和写入错误的数据。还有许多其他方法可以进行 IPC 进程间通信和同一进程通信,例如缓存对象和指向会话数据库的唯一指针
我将代码更改为以下内容:var thread = new Thread(() => Clipboard.SetText("Hello, clipboard")); thread.SetApartmentState(ApartmentState.STA); thread.Start();
并且不再出现错误,但是它没有将文本复制到点击板。
您的方法似乎在服务器内部。看看这个问题的答案。它解决了浏览器中的问题。 ***.com/questions/17527870/…
【参考方案1】:
您采用了错误的方法。您正在从服务器端的角度考虑这一点,但您无法从服务器端访问用户的剪贴板。但是,您可以通过在客户端上运行的 javascript 来执行此操作。但这是一个不同的问题,它是already been answered。
【讨论】:
以上是关于在 ASP.NET 中将线程设置为 STA的主要内容,如果未能解决你的问题,请参考以下文章
如何在 ASP.NET 响应中将 Transfer-Encoding 设置为显式或隐式分块?
在 ASP.NET MVC 中将 FormsIdentity 替换为 WindowsIdentity
我可以在 ASP.NET MVC3 中将自定义类设置为我的控制器的默认基类吗?
在 ASP.NET 中将 HTML 转换为 PDF [重复]