防止同时调用WCF函数

时间:2013-04-18 14:31:58

标签: c# wcf parallel-processing locking task

我有一个作为Windows服务运行的WCF服务。此服务使用公共方法func1引用包含类X的DLL。 func1使用任务(TPL)异步调用另一个方法func2(private)。 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。任何用户都可以触发它。但是在执行期间,如果任何其他用户试图触发它,则应该显示该处理已在运行。 我试图使用静态变量'flag'来检查它,但它似乎没有工作。

任何解决方案?提前谢谢。

1 个答案:

答案 0 :(得分:0)

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

简而言之,对ServiceBehavior进行以下更改:

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

注意:这将禁用服务公开的所有方法中的并发性。如果您不希望这样,则必须将所需方法移动到单独的服务,然后按上述方法进行配置。