2017-03-01 10 views
-1

私はWindows 10 UWPアプリケーションで作業しています。私の要件は、ユニークな価値を持つサーバー上に5つのイメージをアップロードすることです。だから、私はSystem.Threading.Tasks.Task.Factory.StartNew()を使用しています。今、私はデバッグ中にチェックしたとき、私はランダムに2つの画像のためにそれを見つけました、それは同じユニークなキーを送信します。誰かがSystem.Threading.Tasks.Task.Factory.StartNew()を使うほうがよいでしょうか?UWPのSystem.Threading.Tasks.Task.Factory.StartNew()に関する問題?

すべての画像はWebサービスを使用して送信されます。単に呼び出しサイトで

... 
foreach (var image in _imageCollection) 
{ 
    if (!cancellationToken.IsCancellationRequested) 
    { 
    currentTask = UploadAsync(...); 
    uploadTasks.Add(currentTask); 
    } 
} 
await Task.WhenAll(uploadTasks); 


async Task UploadAsync(...) 
{ 
    string imageName = string.Empty; 
    string imagePath = string.Empty; 
    ... 
} 

それとも、もう少し:このための私のサンプルコードは

WebServiceUtility serviceUtility = new WebServiceUtility(); 
List<System.Threading.Tasks.Task> tasks = new List<System.Threading.Tasks.Task>(); 
var cancelSource = new CancellationTokenSource(); 
cancellationToken = cancelSource.Token; 
System.Threading.Tasks.Task currentTask = null; 
List<System.Threading.Tasks.Task> uploadTasks = new List<System.Threading.Tasks.Task>(); 
List<string> uploadedImageIdList = new List<string>(); 
foreach (var image in _imageCollection) 
{ 
    if (!cancellationToken.IsCancellationRequested) 
    { 
     currentTask = await System.Threading.Tasks.Task.Factory.StartNew(async() => 
     { 
      string imageName = string.Empty; 
      string imagePath = string.Empty; 
      if (image.IsEvidenceImage) 
      { 
       imageName = image.EvidencePath.Split('\\')[1]; 
       imagePath = image.EvidencePath; 
      } 
      else 
      { 
       imageName = image.EvidencePath.Split('#')[1].Split('\\')[1]; 
       imagePath = image.EvidencePath.Split('#')[1]; 
      } 
      byte[] _imageAsByteArray = await GetEvidenceFromIsoStore(imagePath); 
      if (null != _imageAsByteArray && _imageAsByteArray.Length > 0) 
      { 
       IRestResponse response = await serviceUtility.UploadImage 
        (_imageAsByteArray, imageName, 
        new RequestDataGenerator().generateRequestDataForMediaUpload(
        (null != _imageItem.I_IS_PRIMARY && "1".Equals(_imageItem.I_IS_PRIMARY) ? "1" : "0"), 
        evidenceName 
        )); 
       if (response != null && response.RawBytes.Length > 0) 
       { 
        var successMessage = MCSExtensions.CheckWebserviceResponseCode(response.StatusCode); 
        if (successMessage.Equals(Constants.STATUS_CODE_SUCCESS)) 
        { 
         byte[] decryptedevidenceresponse = WebserviceED.finaldecryptedresponse(response.RawBytes); 
         string responseString = Encoding.UTF8.GetString(decryptedevidenceresponse, 0, decryptedevidenceresponse.Length); 
         JObject reponseObject = JObject.Parse(responseString); 
         //Debug.WriteLine("Evidence Upload Response : " + Environment.NewLine); 
         uploadedimageIdList.Add(reponseObject["P_RET_ID"].ToString()); 
         try 
         { 
          if (image.IsEvidenceImage) 
          { 
           if (await FileExists(image.EvidencePath)) 
           { 
            StorageFile file = await localFolder.GetFileAsync(image.EvidencePath); 
            await file.DeleteAsync(); 
           } 
          } 
          else 
          { 
           string[] evidenceMedia = image.EvidencePath.Split('#'); 
           foreach (string evidenceItem in evidenceMedia) 
           { 
            if (await FileExists(evidenceItem)) 
            { 
             StorageFile file = await localFolder.GetFileAsync(evidenceItem); 
             await file.DeleteAsync(); 
            } 
           } 
          } 

         } 
         catch (Exception ex) 
         { 
          Debug.WriteLine(ex.Message); 
         } 
        } 
        else 
        { 
         UserMessageUtil.ShowMessage(successMessage); 
        } 
       } 
      } 
     }, cancellationToken); 
     uploadTasks.Add(currentTask); 
    } 
} 

await System.Threading.Tasks.Task.WhenAll(uploadTasks.ToArray()); 
+0

どこで、どのようにあります一意のキーが生成されますか – Rafal

+0

'generateRequestDataForMediaUpload()'で生成されます。 –

+0

貼り付けることができますか?そのメソッドは安全ですか? – Rafal

答えて

2

次ちょうどそれ別の方法で作るれる

... 
var uploadTasks = _imageCollection.Select(x => UploadAsync(...)); 
await Task.WhenAll(uploadTasks); 
+0

'await on currentTask = UploadAsync()'は必要ありませんか? –

+0

いいえ、タスクをリストに保存するだけなので、 'await'は' Task.WhenAll'の一環として発生します。 –

+0

私は1つの疑問を持っています、どうして私にそれを別の方法にするように求めているのですか?何か利点はありますか? –

関連する問題