草庐IT

c# - 在 Excel 中调用 WCF 方法切换 "context"并让 Word 继续 "work"

coder 2024-06-03 原文

我的问题很难解释,因为我自己不能 100% 确定发生了什么。 因此,我将尽力解释情况。

只是一个警告,如果你希望有你必须查看的代码并尝试找出错误,恐怕我无法提供这样的东西,因为我面临的是一个更普遍的问题,而不是一个代码错误。

那么……让我们开始吧

我有一个 Excel 加载项、一个 WPF 应用程序和一个 WCF 服务器,它们都是我编写的,如果需要的话,我可以调整任何一侧。

在我的 Excel 加载项中,我调用 WCF 服务器方法从 WPF 应用程序检索数据。

打开 Excel 工作簿后,我的加载项将更新其值,并因此调用 WCF 服务器。

这在用户“正常”打开 Excel 工作簿时工作正常,但在代码“自动”发生时失败。

一个这样的场景是,提到的 Excel 工作簿在 MS Word 文档中多次链接,例如使用字段函数

{ LINK Excel.Sheet.12 "C:\test.xlsx" "Sheet1!R1C1" }

当用户打开 MS Word 文档时,其中包含指向同一文件的多个链接,MS Word 将为每个链接打开 Excel 工作簿,并在“评估”它之后关闭工作簿。

因此,如果 MS Word 文档有 10 个指向同一个 Excel 工作簿的链接,它将打开/关闭此 Excel 工作簿 10 次。

这又是没问题的。

现在,问题来了。

当用户运行 Excel 实例时,在打开 MS Word 文档之前,它将无法在第二个链接处打开链接的 Excel 工作簿,并显示一条消息,说明工作簿已经打开,如果您第二次打开它如果您想继续,更改将会丢失。

所以出于某种原因,第一次打开工作簿时,MS Word 无法关闭它。

经过大量试验和错误,我将错误定位为对我的 WCF 服务器的调用。

电话是:

ReturnObject result = server.GetBatch(parameters, baseClass);

当我调用这一行时,似乎 Excel 没有阻止 MS Word 继续其工作,因此虽然 MS Word 已经在尝试关闭和打开下一个链接,但我仍在例程中从我的网站获取所有信息WCF 服务器,并且由于我手边还有对 Excel 工作簿的引用,所以 MS Word 根本无法关闭该工作簿。

方法在我的接口(interface)中是这样定义的:

[OperationContract()]
ReturnObject GetBatch(List<Parameter> parameters, ClientInfo clientInfo);

如您所见,我不使用 Task<ReturnObject> ,所以我希望它同步运行并阻止正在运行的线程。

我已经围绕调用方法做了一些测试,可以用这两种方法解决我的问题:

第一种方法:

ReturnObject result = null;
Thread th = new Thread(() => { result = server.GetBatch(parameters, baseClass); });
th.Start();
while (th.IsAlive)
{

}

第二种方法:

ReturnObject result = null;
BackgroundWorker bw = new BackgroundWorker();
bw.DoWork += (sender, args) => { result = server.GetBatch(parameters, baseClass); };
bw.RunWorkerCompleted += (sender, args) => {  };
bw.RunWorkerAsync();

while (bw.IsBusy)
{

}

这两种方法,做的基本相同,唯一的区别是第一个创建了一个 Thread第二个 BackgroundWorker .

我的目标是,对于这两个目标,“卸载”对 WCF 服务器的调用并使用简单的 while 循环阻止调用线程。

您可能会想,我对这些“解决方案”并不是很满意。

有没有办法让 Excel 在调用我的 WCF 服务器方法时“完全”阻塞?

这里实际发生了什么,因为我不太明白发生了什么“魔法”,我只是猜测正在发生一些“Synchronization.Context”切换,但我真的不知道吗?

最佳答案

重点是对 server.GetBatch 的调用已经阻塞,但调用者只是并行任务事件的一部分。

与您的解决方法的唯一区别是 while 循环占用 cpu 资源并且间接阻止执行。

您真正可以考虑的是在 WCF 服务级别管理并发。

只有一个reference在众多之中:

When the service is configured with ConcurrencyMode.Single, WCF will provide automatic synchronization to the service context and disallow concurrent calls by associating the context containing the service instance with a synchronization lock. Every call coming into the service must first try to acquire the lock. If the lock is unowned, the caller will be allowed in. Once the operation returns, WCF will unlock the lock, thus allowing in another caller.

对于正确的 WCF 同步的更广泛的引用,这里是另一个 link .

[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single, 
                 ConcurrencyMode = ConcurrencyMode.Single)]
public class BatchService : IBatchService
{
}

关于c# - 在 Excel 中调用 WCF 方法切换 "context"并让 Word 继续 "work",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46655610/

有关c# - 在 Excel 中调用 WCF 方法切换 "context"并让 Word 继续 "work"的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  3. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  4. ruby - Facter::Util::Uptime:Module 的未定义方法 get_uptime (NoMethodError) - 2

    我正在尝试设置一个puppet节点,但ruby​​gems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由ruby​​gems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby

  5. ruby-on-rails - rails : "missing partial" when calling 'render' in RSpec test - 2

    我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou

  6. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

    我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-

  7. Ruby 方法() 方法 - 2

    我想了解Ruby方法methods()是如何工作的。我尝试使用“ruby方法”在Google上搜索,但这不是我需要的。我也看过ruby​​-doc.org,但我没有找到这种方法。你能详细解释一下它是如何工作的或者给我一个链接吗?更新我用methods()方法做了实验,得到了这样的结果:'labrat'代码classFirstdeffirst_instance_mymethodenddefself.first_class_mymethodendendclassSecond使用类#returnsavailablemethodslistforclassandancestorsputsSeco

  8. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

  9. ruby-on-rails - Rails 3.2.1 中 ActionMailer 中的未定义方法 'default_content_type=' - 2

    我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer

  10. ruby-on-rails - Ruby on Rails with Haml - 如何从 erb 切换 - 2

    我正在从erb文件切换到HAML。我将hamlgem添加到我的系统中。我创建了app/views/layouts/application.html.haml文件。我应该只删除application.html.erb文件吗?此外,仍然有/public/index.html文件被呈现为默认页面。我想创建自己的默认index.html.haml页面。我应该把它放在哪里以及如何使系统呈现该文件而不是默认索引文件?谢谢! 最佳答案 是的,您可以删除任何已转换为HAML的View的ERB版本。至于你的另一个问题,删除public/index/h

随机推荐