2017-03-01 52 views
-1

我正在使用Windows 10 UWP應用程序,我的要求是在服務器上以獨特的值上傳5個圖像。所以,我已經使用了System.Threading.Tasks.Task.Factory.StartNew()。現在,當我在調試過程中進行檢查時,發現有時會隨機選擇2個圖像,它會發送相同的唯一密鑰。有人可能會建議使用System.Threading.Tasks.Task.Factory.StartNew()更好嗎?UWP中的System.Threading.Tasks.Factory.StartNew()問題?

所有圖像都使用網絡服務發送。爲此我的示例代碼如下

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

只是使它成爲一個單獨的方法:

... 
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; 
    ... 
} 

或者,有些更簡單地在調用點:

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

它不需要'await on currentTask = UploadAsync()'嗎? –

+0

不,因爲您只是將任務存儲在列表中。 'await'是'Task.WhenAll'的一部分。 –

+0

我有一個疑問,爲什麼你要求我使它成爲一種不同的方法?有什麼好處嗎? –