防止同时调用WCF函数

本文关键字:WCF 函数 调用 | 更新日期: 2023-09-27 18:10:04

我有一个WCF服务作为windows服务运行。这个服务引用一个包含类X和一个公共方法func1的DLL。func1使用任务(TPL)异步调用另一个方法func2(私有)。Func2独立执行长时间运行的任务。设置如下:

WCF

public string wcfFunc()
{
    X obj = new X();
    return obj.func1();
}

DLL

public class X
    {
        static bool flag;
        public X()
        {
            flag = true;
        }   
        public string func1()
        {
            if (!flag)
                return "Already in action";
            Task t = null;
            t = Task.Factory.StartNew(() => func2(),TaskCreationOptions.LongRunning);    
            return "started";       
        }   
        void func2()
        {
            try
            {
                flag = false;
                //Does a long running database processing work through .Net code
            }
            catch (Exception)
            {
            }
            finally
            {
                flag = true;
            }
        }
}

从网站调用WCF函数。多个用户同时使用该网站。不允许两次执行数据库处理func2。任何用户都可以触发它。但是在执行期间,如果任何其他用户试图触发它,它应该显示处理已经在运行。我尝试使用静态变量"标志"来检查它,但它似乎不工作。

解决方案吗?

防止同时调用WCF函数

您可以阅读下面的文章,为了防止对WCF服务方法的多次调用,除了设置并发模式外,您还需要首先确保只能创建一个服务实例。

简而言之,对你的ServiceBehavior做以下修改:

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

注意:这将禁用你的服务公开的所有方法的并发性,如果你不希望这样,你必须将所需的方法移动到一个单独的服务,然后像上面那样配置它。