2015-12-10 5 views
1
static async void SendTweetWithSinglePicture(string message, string image) 
{ 
    var auth = new SingleUserAuthorizer 
    { 
     CredentialStore = new SingleUserInMemoryCredentialStore 
     { 
      ConsumerKey = "", 
      ConsumerSecret = "", 
      AccessToken = "", 
      AccessTokenSecret = "" 
     } 
    }; 

    var context = new TwitterContext(auth); 

    var uploadedMedia = await context.UploadMediaAsync(File.ReadAllBytes(@image)); 
    var mediaIds = new List<ulong> { uploadedMedia.MediaID }; 

    await context.TweetAsync(
     message, 
     mediaIds 
    ); 
} 
protected void Page_Load(object sender, EventArgs e) 
{ 
    SendTweetWithSinglePicture("test", "path"); 
} 

Как я могу вызвать async метод на Page_Load?Вызов Асинхронный метод в Page_Load

+1

Если вы измените метод 'статическими асинхронной Task' вместо пустоты, вы можете вызвать его с помощью' SendTweetWithSinglePicture ("тест", "путь") Подождите() '. Избегайте 'async void', если вы не используете его для событий. –

+0

Кстати, постарайтесь не публиковать свой вопрос с помощью ключей/секретов API. Любой, кто имеет такую ​​информацию, может захватить учетную запись API. –

+0

@RonBeyer, блокирующий синхронно в приложении ASP, просит умолку. Никогда не вызывайте Task.Wait(), если вы вообще можете его избежать. В этом случае можно просто выполнить асинхронную запись Page_Load или зарегистрировать задачу async, используя встроенные типы ASP. – kai

ответ

0

Вы должны использовать PageAsyncTask. Он имеет образцы на странице MSDN.

// Register the asynchronous task. 
Page.RegisterAsyncTask(new PageAsyncTask(SendTweetWithSinglePicture(message, image)); 

// Execute the register asynchronous task. 
Page.ExecuteRegisteredAsyncTasks(); 

как я указал образец и объяснения на странице MSDN довольно хорошо.

+3

Это может быть более удобно, если вы указали фактический код, а не только на MSDN. – mason

2

Вопрос в том, хотите ли вы сделать асинхронный метод Page_Load или нет. Если это так:

protected async void Page_Load(object sender, EventArgs e) 
{ 
    await SendTweetWithSinglePicture("test", "path"); 
} 

Или, если вы не хотите, чтобы это было async:

protected void Page_Load(object sender, EventArgs e) 
{ 
    SendTweetWithSinglePicture("test", "path").Wait(); 
} 

Это требует вашего метода async вернуть Taskкак он всегда должен! (кроме обработчиков событий)

Проблема с этим может заключаться в том, что метод не завершился до отображения страницы. Если это необходимо, вы должны сделать метод синхронным или зарегистрировать задачу, используя Page.RegisterAsyncTask и Page.ExecuteRegisteredAsyncTasks. Эффективно это также заморозит метод Page_Load.

protected void Page_Load(object sender, EventArgs e) 
{ 
    PageAsyncTask t = new PageAsyncTask(SendTweetWithSinglePicture("test", "path")); 

    // Register the asynchronous task. 
    Page.RegisterAsyncTask(t); 

    // Execute the register asynchronous task. 
    Page.ExecuteRegisteredAsyncTasks(); 
} 
+0

Чтобы использовать 'Wait', подпись метода для SendTweet ... должна быть изменена на' async Task', не так ли? –

+0

Ну, да. Хорошая точка зрения. Все методы async должны (кроме обработчиков событий). –

0

Попробуйте это:.

public void Page_Load(object sender, EventArgs e) 
{ 
    RegisterAsyncTask(new PageAsyncTask(LoadSomeData)); 
} 

public async Task LoadSomeData() 
{ 

    var clientcontacts = Client.DownloadStringTaskAsync("api/contacts"); 
    var clienttemperature =  Client.DownloadStringTaskAsync("api/temperature"); 
    var clientlocation = Client.DownloadStringTaskAsync("api/location"); 

    await Task.WhenAll(clientcontacts, clienttemperature, clientlocation); 

    var contacts =  Newtonsoft.Json.JsonConvert.DeserializeObject<List<Contact>>(await clientcontacts); 
    var location = Newtonsoft.Json.JsonConvert.DeserializeObject<string>(await clientlocation); 
    var temperature = Newtonsoft.Json.JsonConvert.DeserializeObject<string>(await clienttemperature); 

    listcontacts.DataSource = contacts; 
    listcontacts.DataBind(); 
    Temparature.Text = temperature; 
    Location.Text = location; 
} 
+0

Где объявляется 'RegisterAsyncTask'? Пожалуйста, постарайтесь избежать ответов типа «попробуйте». Ответы, не объясняющие, что изменилось и почему не помогают ОП понять проблему. –

+0

Это, безусловно, фиксированный код. Почему вы выказываете без причины? – Dilip

+2

Я дал довольно хорошее объяснение в своем комментарии, если вы хотели бы расширить ответ вместо того, чтобы просто «попробовать это», тогда я бы с удовольствием удалил нисходящий поток. –

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