2017-06-15 52 views
0

我有一个异步任务方法,它将在前台和后台都可以访问。在前台,用户通过按钮调用该方法,而在后台,我有一个定时器在某个时间间隔触发该方法。如何防止异步任务方法同时调用

我试过把锁,但它给予异常等待不能在锁定语句。

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" }; 
     } 
    } 
+0

嗨,你究竟想要完成什么?如果两个事件都只需要调用一次方法,还是希望等到第一次完成后再调用它,您是否想要? –

+0

如果用户调用方法,后台不应该调用,直到第一次完成。 – LittleFunny

+0

如果计时器在用户交互之前触发了一会儿,该怎么办?这意味着,用户方法应该等待吗?或者你想中断后台方法并在以后继续? –

回答

4

我试图把锁,但它给了例外等待不能锁语句中。

lockawait兼容相当于是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后台进程不太熟悉。 –

-3

尝试以下:

await Task.Delay(2000); 
0

我用

AsyncLazy 

对于我的初始化,可以从不同的线程调用。该任务仅被调用一次,其他调用者等待它。