SynchronizationLockException on Monitor.Exit when using await

前端 未结 3 397
逝去的感伤
逝去的感伤 2020-11-29 11:24

I am creating a piece of code that gets a webpage from a legacy system we have. In order to avoid excessive querying, I am caching the obtained URL. I am using Monitor

3条回答
  •  星月不相逢
    2020-11-29 11:59

    You may use interlocked class to simulate the lock statement, here is the code:

        private async Task OpenReport(String report)
        {
            var file = _directory.GetFiles(report + ".html");
            if (file != null && file.Any())
                return file[0].OpenRead();
            else
            {
                object locker = _locker;
                try
                {
                    while (locker == null || Interlocked.CompareExchange(ref _locker, null, locker) != locker)
                    {
                        await Task.Delay(1);
                        locker = _locker;
                    }
                    FileInfo newFile = new FileInfo(Path.Combine(_directory.FullName, report + ".html"));
                    if (!newFile.Exists) // Double check
                    {
                        using (var target = newFile.OpenWrite())
                        {
                            WebRequest request = WebRequest.Create(BuildUrl(report));
                            var response = await request.GetResponseAsync();
                            using (var source = response.GetResponseStream())
                                source.CopyTo(target);
                        }
                    }
                    return newFile.OpenRead();
                }
                finally
                {
                    _locker = locker;
                }
            }
        }
    

提交回复
热议问题