2012-01-08 2 views
2

Я вызываю QueryJourneys, который делает асинхронный вызов d2, но затем он терпит неудачу при попытке загрузить некоторый контент (XML) с помощью WebClient, также асинхронно.Код C#, использующий Async CTP и бросающий InvalidOperationException «Task_Start_NullAction»

я получаю исключение InvalidOperationException строкой «Task_Start_NullAction» в качестве единственного сообщения.

Что не так?

Вызывающий код:

autoCompleteBox.ItemsSource = await OpenAPI.QueryStation(e.Parameter); 

Код за метание исключение:

public static Task<IEnumerable<Journey>> QueryJourneys(
               Point from, 
               Point to, 
               DateTime lastStart) 
    { 
     string str = cs_requestResultPage(from, to, lastStart); 

     Task<IEnumerable<Journey>> t = d2(str); 
     t.Start(); 
     return t; 
    } 

    private static async Task<IEnumerable<Journey>> d2(string str) 
    { 
     var webClient = new WebClient(); 
     webClient.Encoding = Encoding.UTF8; 

     string t = await webClient.DownloadStringTaskAsync(new Uri(str)); 
     var view = new ResultPageView(XDocument.Parse(t)); 

     return view.Journeys; 

ответ

4

Проблема заключается вызов Task.Start(). Задача, возвращаемая методом async, не может быть явно запущена - она ​​уже эффективно выполняется, когда метод возвращается. Вы можете вернуть его непосредственно из метода QueryJourneys:

public static Task<IEnumerable<Journey>> QueryJourneys(Point from, Point to, 
                 DateTime lastStart) 
{ 
    string str = cs_requestResultPage(from, to, lastStart); 
    return d2(str); 
} 

Как и в стороне, я настоятельно рекомендую вам начать давать методам, более значимые имена, следующим конвенциям .NET именование.

(В другой стороне, всегда стоит говорить , который метод выбросил исключение. - в данном случае это, предположительно Task.Start)

+0

Исключение было брошено здесь. Я думал, что написал это, и я, видимо, этого не сделал. 'string t = ждать webClient.DownloadStringTaskAsync (новый Uri (str));' –

+0

@ RobertSundström: Действительно? Это звучит маловероятно - можете ли вы включить полную трассировку стека? Как я уже сказал, бит, который я бы * ожидал *, терпел неудачу, является вызовом 'Task.Start()'. –

+0

В любом случае. Спасибо, что ответили. Я довольно новичок в синтаксисе, и иногда он усложняется. Я действительно интересовался запуском «Задачи». Не думал, что 'await' запустит его для меня автоматически. Интересно, почему я это сделал. Неважно. –

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