相关疑难解决方法(0)

什么是消息泵?

这个帖子(大约一年前发布)中,讨论了在非交互式会话中运行Word时可能遇到的问题.那里给出的(非常强烈的)建议不会这样做.在一篇文章中,它表示"Office API都假设您在桌面上的交互式会话中运行Office,具有监视器,键盘和鼠标,最重要的是消息泵." 我不确定那是什么.(我用C#编程只用了一年左右;我的其他编程经验主要是使用ColdFusion.)

更新:

我的程序运行大量RTF文件,以提取用于构建医疗报告编号的两条信息.我没有尝试弄清楚RTF中的格式化指令是如何工作的,而是决定只在Word中打开它们并从那里拉出文本(而不是实际启动GUI).有时,程序在处理一个文件的中间打嗝,并留下了一个字线打开该文件附有(我仍然要弄清楚如何关闭一个向下).当我重新运行程序时,我当然得到一个通知,说有一个线程正在使用该文件,我是否想要打开一个只读副本?当我说"是"时,Word GUI突然突然冒出来并开始处理文件.我想知道为什么会这样; 但看起来可能一旦弹出对话框,消息泵开始将主GUI推送到Windows?

c# winapi message-pump winmain

95
推荐指数
5
解决办法
4万
查看次数

清理使用InvokeRequired乱丢的代码

我知道,当从任何非UI线程操作UI控件时,您必须封送对UI线程的调用以避免问题.一般的共识是您应该使用测试InvokeRequired,如果为true,则使用.Invoke来执行封送处理.

这会导致很多代码看起来像这样:

private void UpdateSummary(string text)
{
    if (this.InvokeRequired)
    {
        this.Invoke(new Action(() => UpdateSummary(text)));
    }
    else
    {
        summary.Text = text;
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:我可以省略InvokeRequired测试并只调用Invoke,如下所示:

private void UpdateSummary(string text)
{
    this.Invoke(new Action(() => summary.Text = text));
}
Run Code Online (Sandbox Code Playgroud)

这样做有问题吗?如果是这样,是否有更好的方法来保持InvokeRequired测试,而不必在整个地方复制和粘贴此模式?

c# multithreading invoke invokerequired

46
推荐指数
4
解决办法
2万
查看次数

什么是调用?

什么是方法调用,control.invoke?

在编程中一般调用什么

例子 :

MethodInvoker getValues = new MethodInvoker(delegate()
{
    checkbox1Checked = checkbox1.Checked;
    textBox6Text = textBox6.Text;
    textBox7Text = textBox7.Text;
    textBox3Text = textBox3.Text;
    textBox1Text = textBox1.Text;
    textBox4Text = textBox4.Text;
    richTextBox1Text = richTextBox1.Text;
    textBox5Text = textBox5.Text;
});

if (this.InvokeRequired)
{
    this.Invoke(getValues);
}
else
{
    getValues();
}
Run Code Online (Sandbox Code Playgroud)

而且我也想知道MethodInvoker和InvokeRequired是什么意思?

c# invoke visual-studio

11
推荐指数
1
解决办法
2万
查看次数

强制某些代码始终在同一线程上运行

我们有一个旧的第 3 方系统(我们称之为 Junksoft\xc2\xae 95),我们通过 PowerShell 与之交互(它公开了一个 COM 对象),我正在将其包装在 REST API 中( ASP.NET Framework 4.8 和 WebAPI 2)。我使用System.Management.Automationnuget 包创建一个实例,PowerShell在其中将 Junksoft\ 的 COM API 实例化为一个dynamic对象,然后使用:

\n\n
//I\'m omitting some exception handling and maintenance code for brevity\npowerShell = System.Management.Automation.PowerShell.Create();\npowerShell.AddScript("Add-Type -Path C:\\Path\\To\\Junksoft\\Scripting.dll");\npowerShell.AddScript("New-Object Com.Junksoft.Scripting.ScriptingObject");\ndynamic junksoftAPI = powerShell.Invoke()[0];\n\n//Now we issue commands to junksoftAPI like this:\njunksoftAPI.Login(user,pass);\nint age = junksoftAPI.GetAgeByCustomerId(custId);\nList<string> names = junksoftAPI.GetNames();\n
Run Code Online (Sandbox Code Playgroud)\n\n

当我在同一线程上运行所有这些时(例如在控制台应用程序中),这工作得很好。但是,由于某种原因,当我将其放入网络应用程序中的不同控制器并使用它时,这通常不起作用。我说“通常”是因为当 ASP.NET 碰巧向创建的线程发出传入调用时,这实际上会起作用。如果没有,Junksoft 95 会给我一个错误。junksoftAPISystem.Web.Caching.CachejunksoftAPI

\n\n

我有什么方法可以确保所有交互都junksoftAPI发生在同一个 …

c# asp.net powershell multithreading asp.net-web-api2

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