1

API を使用BackgroundUploadAsyncして OneDrive にファイルをアップロードしています。ほとんどの場合、関数は正常に動作しますが、呼び出しで次のエラー メッセージが返されることがあります。

以前のバックグラウンド アップロードでシステムがビジー状態です...

アプリケーションを閉じて再起動しようとしましたが、まだ同じエラーが発生します。

なぜそれが起こるのですか?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 がアカウントをロックしている「疑い」があります。

4

2 に答える 2

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();
    }

    // ...
}
于 2015-02-25T21:46:34.260 に答える