Будет ли это работать в Async параллельно, и это хорошая практика кодирования? - PullRequest
0 голосов
/ 10 июня 2019

Я пытаюсь запустить эти задачи параллельно.Но у меня такое ощущение, что я делаю это неправильно.

Я пытался поискать в Интернете и видел, как многие люди говорят, что следует избегать использования .Результата, но я не знаю, как мне это сделать.что в этом случае.

 var B =  SomeTaskA().
                ContinueWith(result => SomeTaskB(result.Result)).Result; //Task B depends on task A
var D =  SomeTaskC()    //Task C doesn't depend on Task A or B, so i want to run this parallel.
                .ContinueWith(result => SomeTaskD(result.Result)).Result;

            ObjectB bvalue = await B;
            ObjectD dvalue = await D;

Я ожидаю, что он будет работать параллельно, но я не уверен, что это действительно происходит.

1 Ответ

4 голосов
/ 10 июня 2019

Скорее всего, вам нужно запустить их одновременно , а не параллельно.Параллелизм делает больше, чем одну вещь одновременно;параллель - это разделение работы между несколькими потоками.

Во-первых, не используйте ContinueWith;используйте async / await вместо:

async Task AThenB()
{
  var a = await SomeTaskA();
  return await SomeTaskB(a);
}

async Task CThenD()
{
  var c = await SomeTaskC();
  return await SomeTaskD(c);
}

После того, как вы определили эти методы, вы можете использовать await Task.WhenAll для асинхронного параллелизма:

var bTask = AThenB();
var dTask = CThenD();
await Task.WhenAll(bTask, dTask);
ObjectB bValue = await bTask;
ObjectD dValue = await dTask;
...