【问题标题】:Given an event on one thread, what is the best approach to execute a task/method on another thread in .Net?给定一个线程上的事件,在.Net 中的另一个线程上执行任务/方法的最佳方法是什么?
【发布时间】:2010-02-17 22:21:01
【问题描述】:

这就是我想要完成的具体目标:

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

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

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

在我看来,一种首选方法是在需要锁定/解锁时从 WCF 服务中触发事件。与持续轮询相反。然而,锁定/解锁任务的执行需要在不同的线程上进行(例如,在 Windows 服务的上下文中运行的线程)。

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

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

【问题讨论】:

    标签: wcf multithreading events event-handling


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      MS Office 使用名称与目标文件名相似的单独文件执行此操作。只要您可以完全访问目的地,您就可以执行类似的操作,听起来就像您所做的那样。我真的会尽量避免任何实际锁定任何东西。

      您将需要一个签入/签出流程以及一种从签入失败、签出失败和未退回的签出中恢复的方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-14
        • 1970-01-01
        • 1970-01-01
        • 2010-11-25
        • 1970-01-01
        相关资源
        最近更新 更多