TaskCompletionSource не создает [дубликат]

Также я вижу здесь много хороших и объяснительных ответов, поэтому хочу изложить свою точку зрения здесь, в том числе дополнительную информацию, которую я заметил при использовании этого метода.

Тестирование модуля

За последние два года я написал проект хобби, и я не писал для него модульные тесты. После того, как я написал около 50 тыс. Строк, я узнал, что действительно нужно будет писать модульные тесты. Я не использовал интерфейсы (или очень экономно) ... и когда я сделал свой первый модульный тест, я узнал, что это сложно. Почему?

Поскольку мне приходилось делать много экземпляров классов, используемых для ввода в качестве переменных класса и / или параметров. Таким образом, тесты больше походят на интеграционные тесты (нужно сделать полную «инфраструктуру» классов, поскольку все было связано друг с другом).

Страх интерфейсов Итак, я решил использовать интерфейсы. Мой страх состоял в том, что мне приходилось выполнять всю функциональность везде (во всех используемых классах) несколько раз. В некотором роде это верно, однако, используя наследование, его можно значительно уменьшить.

Комбинация интерфейсов и наследования Я обнаружил, что комбинация очень хороша для использования. Я даю очень простой пример.

public interface IPricable
{
    int Price { get; }
}

public interface ICar : IPricable

public abstract class Article
{
    public int Price { get { return ... } }
}

public class Car : Article, ICar
{
    // Price does not need to be defined here
}

Таким образом, копирование кода не требуется, но при этом полезно использовать автомобиль в качестве интерфейса (ICar).

11
задан abatishchev 29 August 2015 в 21:53
поделиться

1 ответ

Ответ заключается в том, что TaskCreationOption полезен только для параметра AttachToParent, поскольку TaskCompletionSource может быть дочерним элементом любой другой задачи. Параметры, связанные с управлением потоками или выполнением заказов, не имеют отношения к контексту объекта TaskCompletionSource. Следующий код действительно выдает исключение:

new TaskCompletionSource<WebResponse>(TaskCreationOptions.LongRunning);
3
ответ дан uzul 22 August 2018 в 01:55
поделиться
  • 1
    Предположим, я называю ваш метод с помощью await Download("http://example.com"), имеет ли смысл вложения? Я бы предположил, что я неявно привязан на основании того факта, что я жду результата ... или там больше? – gzak 8 October 2014 в 09:28
  • 2
    Извините за поздний ответ, поскольку вы, вероятно, знаете, await Download("http://example.com") - это просто синтаксический сахар для Download("http://example.com").ContinueWith( task => { /* then */}. Таким образом, привязка родителя / ребенка является подходящей возможностью, но это, вероятно, плохая практика. – uzul 1 April 2015 в 21:50
Другие вопросы по тегам:

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