如何防止异步任务方法同时调用
问题描述:
我有一个异步任务方法,它将在前台和后台都可以访问。在前台,用户通过按钮调用该方法,而在后台,我有一个定时器在某个时间间隔触发该方法。如何防止异步任务方法同时调用
我试过把锁,但它给予异常等待不能在锁定语句。
public static async Task<CommonResult<IEnumerable<AttendanceDTO>>> DownloadAttendanceAsync(string selectedDate, int siteId)
{
try
{
if (new AttendanceBLL().IsLocalDataAvailable(siteId, DateTime.Parse(selectedDate)))
return new CommonResult<IEnumerable<AttendanceDTO>>() { IsSuccess = true, Data = null };
var queue = new EntityQueueBLL();
//var latestUpdatedOn = queue.GetMaxUpdated(siteId, EntityIDEnum.Attendance);
var url = string.Format(Constants.PathPullAttendance, selectedDate, siteId);
var result = await new HttpRequestClient().GetRequest<IEnumerable<AttendanceDTO>>(url);
if (!result.IsSuccess)
return new CommonResult<IEnumerable<AttendanceDTO>>() { IsSuccess = false, Data = null, ErrorMessage = result.ErrorMessage };
if (result.Data != null && result.Data.Count() > 0)
{
var maxUpdatedOn = result.Data.Max(x => DateTime.Parse(x.UpdatedOn));
queue.Add(siteId, result.Data, result.Data.Count(), EntityIDEnum.Attendance, EntityType.Attendance, maxUpdatedOn);
}
return new CommonResult<IEnumerable<AttendanceDTO>> { IsSuccess = true, Data = result.Data };
}
catch (Exception e)
{
return new CommonResult<IEnumerable<AttendanceDTO>> { IsSuccess = false, Data = null, ErrorMessage = "Download Error" };
}
}
答
我试图把锁,但它给了例外等待不能锁语句中。
的lock
的await
兼容相当于是SemaphoreSlim
:
private static SempahoreSlim _mutex = new SemaphoreSlim(1);
public static async Task<CommonResult<IEnumerable<AttendanceDTO>>> DownloadAttendanceAsync(string selectedDate, int siteId)
{
await _mutex.WaitAsync();
try
{
...
}
catch (Exception e)
{
return new CommonResult<IEnumerable<AttendanceDTO>> { IsSuccess = false, Data = null, ErrorMessage = "Download Error" };
}
finally
{
_mutex.Release();
}
}
+0
与Xamarin iOS有关的一个问题。如果我有一个后台抓取,在这个方法执行的同时,他将调用这个方法。这会造成问题... – LittleFunny
+0
@LittleFunny:对不起,我对iOS后台进程不太熟悉。 –
答
尝试以下:
await Task.Delay(2000);
答
我用
AsyncLazy
对于我的初始化,可以从不同的线程调用。该任务仅被调用一次,其他调用者等待它。
嗨,你究竟想要完成什么?如果两个事件都只需要调用一次方法,还是希望等到第一次完成后再调用它,您是否想要? –
如果用户调用方法,后台不应该调用,直到第一次完成。 – LittleFunny
如果计时器在用户交互之前触发了一会儿,该怎么办?这意味着,用户方法应该等待吗?或者你想中断后台方法并在以后继续? –