2015-02-25 2 views
1

Я использую API BackgroundUploadAsync для загрузки файла в OneDrive. В большинстве случаев функция работает нормально, но иногда возвращается вызов с этим сообщением об ошибке:Как решить ошибку BackgroundUploadAsync?

система занята с предыдущим фоном Загрузить ...

Я попытался закрыть и перезапустить приложение, но я все еще получаю ту же ошибку.

Любая идея, почему это происходит? Как я могу повторно инициализировать соединение с OneDrive?

Вот код, чтобы сделать загрузки:

public static async Task<string> BackgroundUploadFile<T>(
    string skydriveFolderId, 
    T objectToSerialize, 
    string fileNameInSkyDrive, 
    BackgroundTransferPreferences backgroundTransferPreferences = 
     BackgroundTransferPreferences.AllowCellularAndBattery) 
{ 
    string fileId = string.Empty; 
    try 
    { 
     var storageFolder = await GetSharedTransfersFolder(); 

     StorageFile isolatedstorageFile = await storageFolder.CreateFileAsync(
      fileNameInSkyDrive, 
      CreationCollisionOption.ReplaceExisting); 
     using (var writer = new StreamWriter 
      (await isolatedstorageFile.OpenStreamForWriteAsync())) 
     { 
      // convert to string 
      var _String = Serialize(objectToSerialize); 
      await writer.WriteAsync(_String); 
     } 

     Client.BackgroundTransferPreferences = backgroundTransferPreferences; 
     LiveOperationResult liveOpResult = await Client.BackgroundUploadAsync(
      skydriveFolderId, 
      new Uri("/shared/transfers/" + fileNameInSkyDrive, UriKind.Relative), 
      OverwriteOption.Overwrite); 
     fileId = (string)liveOpResult.Result["id"]; 
     Debug.WriteLine("BackgroundUploadFile: " + fileNameInSkyDrive); 
    } 
    catch (Exception e) 
    { 
     MessageBox.Show(e.Message, "Upload Error", MessageBoxButton.OK); 

     Debug.WriteLine("\nError - BackgroundUploadFile: " + e.Message); 
    } 

    return fileId; 
} 

Кроме того, у меня есть «подозрение», что OneDrive является блокировка аккаунта, так как фоновые задачи, которые «застряли» и OneDrive не выпускает/бесплатно их ?!

+0

Скорее всего, вы выдаете новый вызов «BackgroundUploadAsync», пока «Задача», возвращенная предыдущим вызовом, все еще находится на рассмотрении. Вам нужно опубликовать фактический код, чтобы продолжить его. – Noseratio

+0

Включил код загрузки. –

ответ

0

Я не мог сделать BackgroundUploadFile работы, как ожидается, и решить ее с помощью функции прикрепленных загрузок вместо:

 public static async Task<string> UploadFile<T>(string skydriveFolderId, 
                T objectToSerialize, 
                string fileNameInSkyDrive) 
     { 
     string fileID = string.Empty; 
     using (var memoryStream = new MemoryStream()) 
      { 
      try 
       { 
       var serializer = new DataContractJsonSerializer(objectToSerialize.GetType()); 
       serializer.WriteObject(memoryStream, objectToSerialize); 

       memoryStream.Seek(0, SeekOrigin.Begin); 

       LiveOperationResult liveOpResult = await Client.UploadAsync(skydriveFolderId, fileNameInSkyDrive, memoryStream, OverwriteOption.Overwrite); 
       fileID = (string)liveOpResult.Result [ "id" ]; 
       Debug.WriteLine("\nUploadFile: " + fileNameInSkyDrive); 
       } 
      catch (Exception e) 
       { 
       MessageBox.Show(e.Message, "Upload Error", MessageBoxButton.OK); 

       Debug.WriteLine("\nError - UploadFile: " + e.Message); 
       } 
      } 

     return fileID; 
     } 

Thx

1

Есть ли вероятность, что вы позвоните BackgroundUploadAsync где-нибудь еще? Попробуйте защитить его SemaphoreSlimвезде вы можете использовать его:

// class member 
SemaphoreSlim _semaphore = new SemaphoreSlim(1); 

public static async Task<string> BackgroundUploadFile<T>(..) 
{ 
    // ... 

    LiveOperationResult liveOpResult; 
    await _semaphore.WaitAsync(); 
    try 
    { 
     liveOpResult = await Client.BackgroundUploadAsync(
      skydriveFolderId, 
      new Uri("/shared/transfers/" + fileNameInSkyDrive, UriKind.Relative), 
      OverwriteOption.Overwrite); 
    } 
    finally 
    { 
     _semaphore.Release(); 
    } 

    // ... 
} 
+0

Thx. Нет, я не называю это нигде. Интересно, нужно ли мне убирать, может, после его вызова ?! Код более года, и я заметил проблему в прошлом месяце. Интересно, изменилось ли Live 5.6 или что-то еще в Microsoft ?! –

+0

@eitanbarazani, они могли. Попытайтесь создавать/распоряжаться «Клиентом» каждый раз, когда вам это нужно. – Noseratio

+1

Я попробую. Спасибо за предложение. BTW, еще одно наблюдение, когда учетная запись/OneDrive «заблокирована», закрытие приложения или выключение телефона НЕ ОТКРЫВАЕТ аккаунт/OneDrive. Это странное поведение. –

 Смежные вопросы

  • Нет связанных вопросов^_^