在这个帖子(大约一年前发布)中,讨论了在非交互式会话中运行Word时可能遇到的问题.那里给出的(非常强烈的)建议不会这样做.在一篇文章中,它表示"Office API都假设您在桌面上的交互式会话中运行Office,具有监视器,键盘和鼠标,最重要的是消息泵." 我不确定那是什么.(我用C#编程只用了一年左右;我的其他编程经验主要是使用ColdFusion.)
我的程序运行大量RTF文件,以提取用于构建医疗报告编号的两条信息.我没有尝试弄清楚RTF中的格式化指令是如何工作的,而是决定只在Word中打开它们并从那里拉出文本(而不是实际启动GUI).有时,程序在处理一个文件的中间打嗝,并留下了一个字线打开该文件附有(我仍然要弄清楚如何关闭一个向下).当我重新运行程序时,我当然得到一个通知,说有一个线程正在使用该文件,我是否想要打开一个只读副本?当我说"是"时,Word GUI突然突然冒出来并开始处理文件.我想知道为什么会这样; 但看起来可能一旦弹出对话框,消息泵开始将主GUI推送到Windows?
我知道,当从任何非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测试,而不必在整个地方复制和粘贴此模式?
什么是方法调用,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是什么意思?
我们有一个旧的第 3 方系统(我们称之为 Junksoft\xc2\xae 95),我们通过 PowerShell 与之交互(它公开了一个 COM 对象),我正在将其包装在 REST API 中( ASP.NET Framework 4.8 和 WebAPI 2)。我使用System.Management.Automationnuget 包创建一个实例,PowerShell在其中将 Junksoft\ 的 COM API 实例化为一个dynamic对象,然后使用:
//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();\nRun Code Online (Sandbox Code Playgroud)\n\n当我在同一线程上运行所有这些时(例如在控制台应用程序中),这工作得很好。但是,由于某种原因,当我将其放入网络应用程序中的不同控制器并使用它时,这通常不起作用。我说“通常”是因为当 ASP.NET 碰巧向创建的线程发出传入调用时,这实际上会起作用。如果没有,Junksoft 95 会给我一个错误。junksoftAPISystem.Web.Caching.CachejunksoftAPI
我有什么方法可以确保所有交互都junksoftAPI发生在同一个 …