UWP 中 System.Threading.Tasks.Task.Factory.StartNew() 的问题?

金詹·巴夫萨

我正在开发 Windows 10 UWP 应用程序,我的要求是在服务器上上传 5 张具有唯一值的图像。所以,我使用了System.Threading.Tasks.Task.Factory.StartNew().Now,当我在调试时检查时,我发现有时对于 2 个图像,它会随机发送相同的唯一密钥。有人可以建议使用 System.Threading.Tasks.Task.Factory.StartNew() 更好吗?

所有图像均使用Web服务发送。我的示例代码如下

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());
斯蒂芬·克利里

只需将其作为一个单独的方法:

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

System.Threading.Tasks.Task循环执行异常行为

来自分类Dev

System.Threading.Tasks.Parallel

来自分类Dev

转换-“结果”不是“ System.Threading.Tasks.Task”的成员

来自分类Dev

Task.Factory.StartNew and synchronization context

来自分类Dev

Task.Factory.StartNew与新Task

来自分类Dev

检查Task.Factory.StartNew何时完成?

来自分类Dev

无法将类型'bool'隐式转换为'system.threading.tasks.task bool'

来自分类Dev

有关Task.Factory.StartNew的基本问题

来自分类Dev

如何在C#中重新启动System.Threading.Tasks.Task

来自分类Dev

System.Threading.Thread.Sleep(1000)与System.Threading.Tasks.Task.Delay(1000).Wait()

来自分类Dev

无法从'System.Threading.Tasks.Task'转换为'System.Collections.Generic.Dictionary <string,string>'

来自分类Dev

Task.Run与Task.Factory.StartNew的返回类型

来自分类Dev

循环使用Task.Factory.StartNew

来自分类Dev

RenderPartialAsync返回System.Threading.Tasks.Task`1 [System.Threading.Tasks.VoidTaskResult]

来自分类Dev

MaxDegreeOfParallelism与Task.Factory.StartNew()

来自分类Dev

Task.Factory.StartNew保证执行顺序

来自分类Dev

委托'System.Action <System.Threading.Tasks.Task>'不接受0参数

来自分类Dev

SignalR错误无法将类型'System.Threading.Tasks.Task <object>'隐式转换为'string'

来自分类Dev

找不到方法:'System.Threading.Tasks.Task`1 <!! 0>

来自分类Dev

System.Threading.Tasks.Task在循环中执行奇怪的行为

来自分类Dev

System.Threading.Tasks.Parallel

来自分类Dev

检查Task.Factory.StartNew何时完成?

来自分类Dev

在Subscribe中调用Task.Factory.StartNew(async()=> {})通常是可疑的吗?

来自分类Dev

无法从'System.Threading.Tasks.Task'转换为'System.Collections.Generic.Dictionary <string,string>'

来自分类Dev

Moq方法,由System.Threading.Tasks.Task.Factory.StartNew调用

来自分类Dev

循环使用Task.Factory.StartNew

来自分类Dev

委托'System.Action <System.Threading.Tasks.Task>'不接受0参数

来自分类Dev

为什么异步函数返回System.Threading.Tasks.Task`1 [System.String]?

来自分类Dev

无法从“void”转换为 System.Threading.Tasks.Task<System.Action>

Related 相关文章

  1. 1

    System.Threading.Tasks.Task循环执行异常行为

  2. 2

    System.Threading.Tasks.Parallel

  3. 3

    转换-“结果”不是“ System.Threading.Tasks.Task”的成员

  4. 4

    Task.Factory.StartNew and synchronization context

  5. 5

    Task.Factory.StartNew与新Task

  6. 6

    检查Task.Factory.StartNew何时完成?

  7. 7

    无法将类型'bool'隐式转换为'system.threading.tasks.task bool'

  8. 8

    有关Task.Factory.StartNew的基本问题

  9. 9

    如何在C#中重新启动System.Threading.Tasks.Task

  10. 10

    System.Threading.Thread.Sleep(1000)与System.Threading.Tasks.Task.Delay(1000).Wait()

  11. 11

    无法从'System.Threading.Tasks.Task'转换为'System.Collections.Generic.Dictionary <string,string>'

  12. 12

    Task.Run与Task.Factory.StartNew的返回类型

  13. 13

    循环使用Task.Factory.StartNew

  14. 14

    RenderPartialAsync返回System.Threading.Tasks.Task`1 [System.Threading.Tasks.VoidTaskResult]

  15. 15

    MaxDegreeOfParallelism与Task.Factory.StartNew()

  16. 16

    Task.Factory.StartNew保证执行顺序

  17. 17

    委托'System.Action <System.Threading.Tasks.Task>'不接受0参数

  18. 18

    SignalR错误无法将类型'System.Threading.Tasks.Task <object>'隐式转换为'string'

  19. 19

    找不到方法:'System.Threading.Tasks.Task`1 <!! 0>

  20. 20

    System.Threading.Tasks.Task在循环中执行奇怪的行为

  21. 21

    System.Threading.Tasks.Parallel

  22. 22

    检查Task.Factory.StartNew何时完成?

  23. 23

    在Subscribe中调用Task.Factory.StartNew(async()=> {})通常是可疑的吗?

  24. 24

    无法从'System.Threading.Tasks.Task'转换为'System.Collections.Generic.Dictionary <string,string>'

  25. 25

    Moq方法,由System.Threading.Tasks.Task.Factory.StartNew调用

  26. 26

    循环使用Task.Factory.StartNew

  27. 27

    委托'System.Action <System.Threading.Tasks.Task>'不接受0参数

  28. 28

    为什么异步函数返回System.Threading.Tasks.Task`1 [System.String]?

  29. 29

    无法从“void”转换为 System.Threading.Tasks.Task<System.Action>

热门标签

归档