给定一个线程上的事件,在.Net中的另一个线程上执行任务/方法的最佳方法是什么?

时间:2010-02-17 22:21:01

标签: wcf multithreading events event-handling

具体来说,我要完成的是:

使用.Net 3.5,我有一个Windows服务,我在其中运行WCF服务。我有一个客户端,它从WCF服务(Net.Tcp绑定)请求一个文件,然后由WCF服务复制到指定的位置,然后客户端可以对其进行编辑/修改。 WCF服务正在InstanceContextMode.PerSession模式下运行。

在编辑文件时,我希望将文件锁定在托管WCF服务的计算机上。返回文件后,我希望再次解锁文件。我不相信我可以在WCF服务中锁定文件,因为一旦文件被复制,服务会话就会结束,我认为在那时不会保留文件上的锁。

一个解决方案(我不感兴趣)是在Windows服务中创建一个线程,它可以维护一个List<>根据需要锁定/解锁这些文件。当然,必须同步对此列表的访问才能进行多线程访问。此解决方案需要不断轮询列表以检测正在添加的新文件和删除的文件。

我认为首选的方法是在需要锁定/解锁时从WCF服务中触发事件。而不是持续的民意调查。然而,锁定/解锁任务的执行需要在不同的线程上发生(例如,在Windows服务的上下文中运行的线程)。

我们使用Windows Forms执行此操作,从后台线程我们可以调用在UI消息传递线程上执行的方法。有没有办法在另一个线程(而不是UI消息传递线程)上“调用”一个方法?

有关如何最好地解决这个问题的任何建议吗?

2 个答案:

答案 0 :(得分:1)

您是否考虑过使用锁定/解锁服务处理此问题?这样,您可以在需要时从WCF调用锁定服务,并让其他服务处理锁定问题。这项服务也将处理孤儿签到等。

答案 1 :(得分:0)

MS Office使用名称与目标文件名相似的单独文件执行此操作。只要您拥有对目的地的完全访问权限,您就可以这样做,听起来就像您一样。我真的试图避免任何实际锁定任何东西。

您需要一个签入/结帐流程以及从失败的签到和未签出的退回以及未退回的签出中获取的方法。