0

我有一个作为 Windows 服务运行的 WCF 服务。该服务引用一个包含类 X 的 DLL,该类具有公共方法 func1。func1 使用任务(TPL) 异步调用另一个方法 func2(private)。func2 独立执行长时间运行的任务。设置是:

WCF

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

动态链接库

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。任何用户都可以触发它。但是在执行过程中,如果任何其他用户试图触发它,它应该表明处理已经在运行。我尝试使用静态变量“标志”来检查它,但它似乎不起作用。

有什么解决办法吗?提前致谢。

4

1 回答 1

0

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

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

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

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

于 2013-04-18T14:50:25.887 回答