在Async方法中实现信号量

时间:2017-03-23 09:08:36

标签: c# task semaphore

考虑到我的WCF服务中有以下(非常基本的)方法:

public async Task MyMethod()
{
    await Task.Run(() => 
    {
        //do stuff
    });
}

我面临的问题是任务中的代码搜索数据库,发送所需记录的电子邮件并在发送时更新数据库,但是如果呼叫要快速连续两次,那么潜在的重复可能是发送。

是否可以在此方法中实现信号量以防止这种情况,因为我编写的UWP应用程序会异步调用该方法?

1 个答案:

答案 0 :(得分:1)

在类型为Mutex的类中创建一个私有字段,并保护代码,如下所示:

private Mutex _mutex = new Mutex();
private DateTime _lastRequest = DateTime.MinValue;

...   

public async Task MyMethod()
{
    await Task.Run(() => 
    {
        _mutex.WaitOne();
        if(DateTime.Now < _lastRequest + TimeSpan.FromSeconds(3))
            return;

        _lastRequest = DateTime.Now;

        //do stuff
        _mutex.ReleaseMutext();
    });
}