Я скептически отношусь к вашему желанию избегать использования анонимных методов или лямбда-выражений. Они удобны, идиоматичны, и функционально вы все равно будете делать что-то, по сути, то же самое, но без помощи компилятора.
Вы можете прочитать документы Task.Run()
так же, как и все остальные, я полагаю, так что вы можете легко увидеть, что нет никакой перегрузки для этого метода, который обеспечивает параметризованный вызов делегата задачи. Так что вам нужно будет обеспечить это для себя.
Вы можете сделать это точно так же, как компилятор C # сделает это за вас, если вы захотите использовать лямбда-выражение. В частности, вам нужно будет объявить тип для хранения параметра, который имеет подходящий метод для вызова задачи.
Например:
class CountToBillionWrapper
{
private readonly int _workerId;
public CountToBillionWrapper(int workerId)
{
_workerId = workerId;
}
public int CountToBillion()
{
// do whatever, using the _workerId field as if it had been passed to the method
}
}
Тогда вы можете сделать это:
CountToBillionWrapper wrapper = new CountToBillionWrapper(workerId);
int result = await Task.Run(wrapper.CountToBillion);
Так как это, по сути, то, как компилятор C # реализует замыкание, которое будет необходимо при использовании лямбда-выражения, которое захватывает переменные, которые вы хотите передать в метод, я не вижу смысла делать это так путь. Похоже, дополнительная работа для трудного для чтения кода для меня.
Но, возможно, вы предпочитаете откровенность. Если так, то вышеприведенное сработает, чтобы выполнить то, что вы просите.