using System.Threading.Tasks;
using System.Collections.Concurrent;
private static async Task UploadFile(FileInfo fileInfo, ImportFileInfo importFileInfo)
using (var proxy = new Proxy())
using (var stream = new FileStream(fileInfo.FullName, FileMode.Open, FileAccess.Read))
importFileInfo.FileByteStream = stream;
proxy.UploadAndImport(importFileInfo);
await Task.Run(() => Poller.Poll(timeoutSeconds: 90, intervalSeconds: 1, func: () =>
using (var proxy = new Proxy())
return proxy.UploadAndImportIsComplete(importFileInfo.OperationId);
public class Proxy : IDisposable
static ImportFileInfo _inProgressRequest = null;
static readonly ConcurrentDictionary<Guid, ImportFileInfo> WaitingRequests = new ConcurrentDictionary<Guid, ImportFileInfo>();
public void UploadAndImport(ImportFileInfo request)
WaitingRequests.TryAdd(request.OperationId, request);
while (null != Interlocked.CompareExchange(ref _inProgressRequest, request, null))
Interlocked.Exchange(ref _inProgressRequest, null);
WaitingRequests.TryRemove(request.OperationId, out _);
public bool UploadAndImportIsComplete(Guid operationId) => !WaitingRequests.ContainsKey(operationId);
private void ImportFile(ImportFileInfo request)
public class ImportFileInfo
public Stream FileByteStream
public static bool Poll(int timeoutSeconds, int intervalSeconds, Func<bool> func)