我有一个作为Windows服务运行的WCF服务。此服务使用公共方法func1引用包含类X的DLL。 func1使用任务(TPL)异步调用另一个方法func2(private)。 func2独立执行长时间运行的任务。设置是:
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。任何用户都可以触发它。但是在执行期间,如果任何其他用户试图触发它,则应该显示该处理已在运行。 我试图使用静态变量'flag'来检查它,但它似乎没有工作。
任何解决方案?提前谢谢。
答案 0 :(得分:0)
您可以阅读以下article,以防止多次调用WCF服务方法,除了设置并发模式之外,您还需要首先确保只能创建一个服务实例。
简而言之,对ServiceBehavior进行以下更改:
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single, InstanceContextMode=InstanceContextMode.Single)]
public class YourService: IYourService
{...}
注意:这将禁用服务公开的所有方法中的并发性。如果您不希望这样,则必须将所需方法移动到单独的服务,然后按上述方法进行配置。