2017-06-15 77 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 

對於我的初始化,可以從不同的線程調用。該任務僅被調用一次,其他調用者等待它。