2013-03-17 4 views
4

Если это асинхронный запрос, он будет возвращаться без ошибок, почему он бросает ошибку без async, async бесполезен в этой операции.Невозможно неявно преобразовать тип 'int' в '... Задачи <int>'

public Task<int> countUp() 
{ 
    string compare = txtTag.Text; 
    int count = 0; 
    for (int i = 0; i < dataGridView1.Rows.Count; i++) 
    { 
     if (compare == dataGridView1[0, i].Value.ToString()) 
     { 
      BeginInvoke(new Action(() => 
      { 
       count++; 
       txtCount.Text = count.ToString(); 
      })); 
     } 
    } 

    return count; 
} 
+2

Почему вы должны вернуть '' Задача , а не просто обычный 'int'? – thecoop

+0

Мне нужно, чтобы он бежал по другой теме. Как вы передаете инструкции от пользовательского интерфейса к задаче? – ploxtic

+2

Вы, похоже, ошибаетесь, что метод async работает в другом потоке. Это не.Асинхронный метод содержит * асинхронный ожидание *, и * немедленно возвращается, когда ожидание происходит *. Затем он * возобновляет то, где он остался *, когда ожидаемое значение доступно. Убедитесь, что вы это понимаете; ** совершенно не так, что асинхронный метод обязательно выполняется на другом потоке; на самом деле, одна из причин, по которым мы добавили асинхронные методы в C#, заключалась в том, чтобы: * уменьшить * зависимость от потоков в качестве механизма асинхронизации. –

ответ

8

Как ошибка четко указано, что вы не можете вернуть int как Task<int>. (Если вы не сделать его async метод, который делает время компиляции магии создать Task<T>.

Если ваш метод не является асинхронным, вы не должны возвращать Task<T> в первую очередь.
Вместо этого, просто вернуться int непосредственно.

Если по какой-то причине, вы потребность вернуть Task<T>, вы можете позвонить Task.FromResult() создать законченную задачу с заданным значением.

13

Ну, вы могли вернуть заполненную задачу:

return Task.FromResult(count); 

http://msdn.microsoft.com/en-us/library/hh194922.aspx

Почему вы хотите вернуться задача немного тайны, хотя. Концептуально задача представляет собой обещание, что что-то произойдет в будущем. В вашем случае это уже произошло, поэтому использование задачи совершенно бессмысленно.

3

В этом методе нет ничего, что указывает на то, что это асинхронный метод, за исключением того, что вы заявили, что он возвращает Task<int>.

Однако вы не возвращаете Task<int>, вы возвращаете count, int.

Поскольку вы не дожидаетесь завершения действия, я бы удалил возвращаемый тип Task<int> и заменил его только int, так как этот метод полностью синхронный (за исключением части, которую вы так долго не ожидали).

1

Код здесь явно неверен. Попробуйте посмотреть тип возврата в вашем коде. Вы возвращаетесь и int, которые не соответствуют типу возврата, ожидающему Task<int>. Если вы не собираетесь использовать async в этом методе, вы можете просто изменить свой тип возврата на int.

Однако, если вы настаиваете на возвращении Task<int> вместо int, вы можете использовать следующие для оператора возврата

return Task.FromResult(count) 

Это будет обернуть ваш int в Task<int>. Для получения дополнительной информации о Task.FromResult, вы можете посетить: https://msdn.microsoft.com/en-us/library/hh194922(v=vs.110).aspx What is the use for Task.FromResult<TResult> in C#

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