2015-11-23 6 views
2

Я использую класс Task в C# и хочу передать предопределенный метод, который возвращает значение и не использует lambdas для метода Task.Run.Task.Run Неоднозначные перегрузки параметров

Вот консольное приложение с кодом:

static int ThreadMethod() 
{ 
    return 42; 
} 

static void Main(string[] args) 
{ 
    Task<int> t = Task.Run(function:ThreadMethod); 
    WriteLine(t.Result); 
} 

Однако она возвращается сообщение об ошибке:

The call is ambiguous between the following methods or properties: 'Task.Run<TResult>(Func<TResult>)' and 'Task.Run(Func<Task>)'

Я пытался делать это, чтобы исправить это и получили мой ожидаемый результат:

Task<int> t = Task.Run((Func<int>)ThreadMethod); 

Однако, я не уверен, что я делаю это правильно или есть лучшее решение?

+0

Func and Action - это просто делегаты. у них нет только названия;). Вместо этого используйте лямбда. они анонимные делегаты кстати. '() => ThreadMethod()' –

+0

некоторыми трюками, если вы не хотите использовать лямбду по любой причине. вы можете это сделать. 'Task.Run (function: ThreadMethod)'. но вы должны изменить свою подпись метода на это. 'static async Задача ThreadMethod()'. это бессмысленно, но оно компилируется. –

+0

whoah часть 'async' сделала это более запутанным. Извините, я все еще нооб в многозадачности и асинхронном программировании на C# –

ответ

1

Исправьте аргумент .Run, как в этом примере. Может быть скопирован и вставлен в LinqPad для тестирования.

public static void Main(string[] args) 
{ 
    Task<int> t = Task.Run(() => ThreadMethod()); 
    WriteLine(t.Result); 
} 

public static int ThreadMethod() 
{ 
    return 42; 
} 

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

public static void Main(string[] args) 
{ 

    //Func<int> is saying I want a function with no parameters 
    //but returns an int. '() =>' this represents a function with 
    //no parameters. It then points to your defined method ThreadMethod 
    //Which fits the notions of no parameters and returning an int. 

    Func<int> threadMethod =() => ThreadMethod(); 

    Task<int> t = Task.Run(threadMethod); 
    Console.WriteLine(t.Result); 
} 

public static int ThreadMethod() 
{ 
    return 42; 
} 

Вот Documentation на Func (T), в меню слева вы можете выбрать различные варианты объектов Func().

+0

Можете ли вы уточнить для меня, почему это лучший способ, чем кастинг (Func )? Я просто хочу лучше понять это. Или, может быть, хорошая рекомендация действительно поможет. –

+0

Обновлен мой ответ со ссылкой на документацию для изучения. –

+0

Спасибо. Я рассмотрю всю предоставленную вами информацию и попытаюсь понять ее еще больше. –

Смежные вопросы