相关疑难解决方法(0)

如何将消息发布到运行消息泵的STA线程?

因此,在此之后,我决定在专用的STA线程上显式实例化COM对象.实验表明COM对象需要一个消息泵,我通过调用它来创建Application.Run():

private MyComObj _myComObj;

// Called from Main():
Thread myStaThread = new Thread(() =>
{
    _myComObj = new MyComObj();
    _myComObj.SomethingHappenedEvent += OnSomthingHappened;
    Application.Run();
});
myStaThread.SetApartmentState(ApartmentState.STA);
myStaThread.Start();
Run Code Online (Sandbox Code Playgroud)

如何从其他线程发布STA线程的消息泵消息?

注意: 为了简洁起见,我对问题进行了大量编辑.@Servy的答案的某些部分现在似乎无关紧要,但它们是针对原始问题的.

c# com interop message-queue sta

14
推荐指数
1
解决办法
8494
查看次数

单线公寓问题

从我的mainform我打电话给以下打开一个新表格

MyForm sth = new MyForm();
sth.show();
Run Code Online (Sandbox Code Playgroud)

一切都很好但是这个表单有一个组合框,当我将其AutoCompleteMode切换为建议和附加时,我在显示表单时遇到了这个异常:

在进行OLE调用之前,必须将当前线程设置为单线程单元(STA)模式.确保您的Main函数标记了STAThreadAttribute.

我已根据异常的请求在我的main函数上设置了此属性:

[STAThread]
static void Main(string[] args)
{ ...
Run Code Online (Sandbox Code Playgroud)

我可以请一些帮助来了解可能出错的地方.

示例代码:

private void mainFormButtonCLick (object sender, EventArgs e)
{
    // System.Threading.Thread.CurrentThread.SetApartmentState(ApartmentState.STA); ?
    MyForm form = new MyForm();
    form.show();
}
Run Code Online (Sandbox Code Playgroud)

设计师:

this.myCombo.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.Suggest;
this.myCombo.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems;
this.myCombo.FormattingEnabled = true;
this.myCombo.Location = new System.Drawing.Point(20, 12);
this.myCombo.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.myCombo.Name = "myCombo";
this.myCombo.Size = new System.Drawing.Size(430, 28);
this.myCombo.Sorted = true;
this.myCombo.TabIndex = 0; phrase";
Run Code Online (Sandbox Code Playgroud)

设置数据源

public MyForm(List<string> elem)
{
    InitializeComponent(); …
Run Code Online (Sandbox Code Playgroud)

c# multithreading thread-safety winforms

8
推荐指数
1
解决办法
9525
查看次数

如何通过任务使用 Clipboard.GetText?

我正在编写一个 Windows 窗体应用程序,该应用程序可以自动化旧软件。为了在该软件和我的应用程序之间传输信息,我使用剪贴板。单击旧软件上的按钮会将一些信息放入剪贴板中。

为了使用Clipboard.GetText我应该从 Windows 窗体中调用它。但我不希望一切都在 UI 线程上。

在另一个任务中调用 Clipboard.GetText 时,我得到它说你应该从 STAThread 调用 Clipboard.GetText。

c# clipboard multithreading task

3
推荐指数
1
解决办法
1694
查看次数