Код: Выделить всё
public class BackgroundUploadDelegate : NSUrlSessionDataDelegate
{
private SemaphoreSlim _semaphore;
public SemaphoreSlim Semaphore { get; set; }
private NSMutableData _responseData;
public NSMutableData ResponseData { get; set; }
public override void DidReceiveData(NSUrlSession session, NSUrlSessionDataTask dataTask, NSData data)
{
_responseData = new NSMutableData();
_responseData.AppendData(data);
}
public override void DidCompleteWithError(NSUrlSession session, NSUrlSessionTask task, NSError error)
{
if (error != null)
{
Console.WriteLine("Error: " + error.LocalizedDescription);
RetryTask(task);
}
Semaphore?.Release();
}
private void RetryTask(NSUrlSessionTask task)
{
task.Resume();
}
public override void DidFinishEventsForBackgroundSession(NSUrlSession session)
{
var appDelegate = UIApplication.SharedApplication.Delegate as AppDelegate;
appDelegate?.BackgroundSessionCompletionHandler?.Invoke();
}
}
< /code>
Конфигурация сеанса: < /p>
var config = NSUrlSessionConfiguration.CreateBackgroundSessionConfiguration("backgroundUpload");
config.Discretionary = false;
config.SessionSendsLaunchEvents = true;
config.WaitsForConnectivity = true;
config.AllowsCellularAccess = true;
config.AllowsExpensiveNetworkAccess = true;
config.AllowsConstrainedNetworkAccess = true;
NSOperationQueue backgroundQueue = new NSOperationQueue
{
MaxConcurrentOperationCount = 3,
Name = "backgroundUpload"
};
var delegateInstance = new BackgroundUploadDelegate();
var session = NSUrlSession.FromConfiguration(config, delegateInstance, backgroundQueue);
< /code>
Отправка запроса: < /p>
((BackgroundUploadDelegate)session.Delegate).Semaphore = new SemaphoreSlim(0);
var uploadTask = session.CreateUploadTask(request);
uploadTask.Resume();
((BackgroundUploadDelegate)session.Delegate).Semaphore.Wait();
Подробнее здесь: https://stackoverflow.com/questions/795 ... nd-resumes
Мобильная версия