2013-07-03 41 views
1

我會通過發佈這是困擾代碼開始:C#等待lambda函數

public async Task main() 
    { 
     Task t = func(); 
     await t; 
     list.ItemsSource = jlist; //jlist previously defined 
    } 


    public async Task func() 
    { 
     TwitterService service = new TwitterService(_consumerKey, _consumerSecret); 
     service.AuthenticateWith(_accessToken, _accessTokenSecret); 


     TwitterGeoLocationSearch g = new TwitterGeoLocationSearch(40.758367, -73.982706, 25, 0); 


     SearchOptions s = new SearchOptions(); 
     s.Geocode = g; 
     s.Q = ""; 
     s.Count = 1; 
     service.Search(s, (statuses, response) => get_tweets(statuses, response)); 

    void get_tweets(TwitterSearchResult statuses, TwitterResponse response) 
    { 
     //unimportant code 
     jlist.Add(info); 
     System.Diagnostics.Debug.WriteLine("done with get_tweets, jlist created"); 

    } 

我有與get_tweets問題(..)功能在運行中(我相信什麼不同的線程)和任務t不像我在主函數中那樣等待。基本上,我的問題是,list.Itemsource = jlist在get_tweets函數完成之前運行。有沒有人有解決方案或正確的方向指向我?

+2

你沒有得到警告說,你的'FUNC()'異步方法不包含任何'await'聲明? –

+0

我認爲您沒有複製足夠的代碼來查看問題所在;例如,func()沒有await語句,所以應該同步運行。 – antlersoft

+1

@antlersoft不,有足夠的代碼。問題是他使用了一個回調方法,所以它是異步的,但它使用了一個非任務異步模型。這是根本問題。 – Servy

回答

0

首先,使用TaskCompletionSourceTwitterService.Search創建TAP wrapper。因此,像:

public static Task<Tuple<TwitterSearchResult, TwitterResponse>> SearchAsync(this TwitterService service, SearchOptions options) 
{ 
    var tcs = new TaskCompletionSource<Tuple<TwitterSearchResult, TwitterResponse>>(); 
    service.Search(options, (status, response) => tcs.SetResult(Tuple.Create(status, response))); 
    return tcs.Task; 
} 

然後你就可以使用await消耗它:

SearchOptions s = new SearchOptions(); 
s.Geocode = g; 
s.Q = ""; 
s.Count = 1; 
var result = await service.SearchAsync(s); 
get_tweets(result.Item1, result.Item2);