как объединить несколько действий < T > в одном действии < T > в C #?

Читайте в Cancellation (который был введен в .NET 4.0 и в значительной степени не изменился с тех пор) и Асинхронный шаблон на основе задач , в котором содержатся рекомендации о том, как используйте CancellationToken с методами async.

Чтобы суммировать, вы передаете CancellationToken в каждый метод, который поддерживает отмену, и этот метод должен периодически проверять его.

private async Task TryTask()
{
  CancellationTokenSource source = new CancellationTokenSource();
  source.CancelAfter(TimeSpan.FromSeconds(1));
  Task task = Task.Run(() => slowFunc(1, 2, source.Token), source.Token);

  // (A canceled task will raise an exception when awaited).
  await task;
}

private int slowFunc(int a, int b, CancellationToken cancellationToken)
{
  string someString = string.Empty;
  for (int i = 0; i < 200000; i++)
  {
    someString += "a";
    if (i % 1000 == 0)
      cancellationToken.ThrowIfCancellationRequested();
  }

  return a + b;
}

16
задан JohnKeller 1 April 2010 в 10:51
поделиться

1 ответ

Это действительно просто, потому что делегаты уже многоадресны:

Action<ISomeInterface> action1 = z => z.MethodOne();
Action<ISomeInterface> action2 = z => z.MethodTwo("relativeFolderName");
builder.BuildMap(action1 + action2, "IAnotherInterfaceName");

Или, если у вас по какой-то причине их коллекция:

IEnumerable<Action<ISomeInterface>> actions = GetActions();
Action<ISomeInterface> action = null;
foreach (Action<ISomeInterface> singleAction in actions)
{
    action += singleAction;
}

Или даже :

IEnumerable<Action<ISomeInterface>> actions = GetActions();
Action<ISomeInterface> action = (Action<ISomeInterface>)
    Delegate.Combine(actions.ToArray());
30
ответ дан 30 November 2019 в 17:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: