Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何防止异步任务方法被并发调用_C#_Xamarin_Async Await_Locking - Fatal编程技术网

C# 如何防止异步任务方法被并发调用

C# 如何防止异步任务方法被并发调用,c#,xamarin,async-await,locking,C#,Xamarin,Async Await,Locking,我有一个异步任务方法,可以在前台和后台访问。在前台,用户通过按钮调用此方法,而在后台,我有一个计时器在某个时间间隔内触发此方法 我试着把锁放进去,但它给出了异常等待不能在锁语句里面 public static async Task<CommonResult<IEnumerable<AttendanceDTO>>> DownloadAttendanceAsync(string selectedDate, int siteId) {

我有一个异步任务方法,可以在前台和后台访问。在前台,用户通过按钮调用此方法,而在后台,我有一个计时器在某个时间间隔内触发此方法

我试着把锁放进去,但它给出了异常等待不能在锁语句里面

    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" };
        }
    }
公共静态异步任务下载AttendanceAsync(字符串selectedDate,int siteId)
{
尝试
{ 
if(新AttendanceBell().IsLocalDataAvailable(siteId,DateTime.Parse(selectedDate)))
返回新的CommonResult(){IsSuccess=true,Data=null};
var queue=new EntityQueueBLL();
//var latestUpdatedOn=queue.GetMaxUpdated(siteId,EntityIDEnum.attention);
var url=string.Format(Constants.pathPullAttention、selectedDate、siteId);
var result=等待新的HttpRequestClient().GetRequest(url);
如果(!result.issucess)
返回新的CommonResult(){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));
添加(siteId、result.Data、result.Data.Count()、EntityIDEnum.Attention、EntityType.Attention、MaxUpdateOn);
}
返回新的CommonResult{IsSuccess=true,Data=result.Data};
}
捕获(例外e)
{
返回新的CommonResult{IsSuccess=false,Data=null,ErrorMessage=“下载错误”};
}
}
尝试以下方法:

await Task.Delay(2000);
我试着把锁放进去,但它给出了异常等待不能在锁语句里面

    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" };
        }
    }
wait
-与
lock
兼容的等价物是
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();
  }
}
private static SempahoreSlim\u mutex=新信号量lim(1);
公共静态异步任务下载AttendanceAsync(字符串selectedDate,int siteId)
{
wait_mutex.WaitAsync();
尝试
{ 
...
}
捕获(例外e)
{
返回新的CommonResult{IsSuccess=false,Data=null,ErrorMessage=“下载错误”};
}
最后
{
_mutex.Release();
}
}
我使用

AsyncLazy

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

嗨,你到底想做什么?对于这两个事件,您是希望只调用一次方法,还是希望等到第一次调用完成后再调用它?如果用户调用方法,则后台不应调用,直到第一次调用完成。如果计时器在用户交互之前触发,该怎么办?这意味着,用户方法应该等待,对吗?或者您想中断后台方法,稍后继续?对前一个问题是。如果两者都有可能同时进入该方法,一个问题与Xamarin iOS有关。如果我有一个后台fetch,谁会在这个方法执行的同时调用这个方法。这会产生问题吗…@LittleFunny:对不起,我对iOS的后台程序还不太熟悉。