我正在尝试使用一个简单的控制台应用程序。我在等待中磕磕绊绊。如果我没有等待,我的PinAuthorization正在运行,我从twitter获取代码,输入它但不能发送推文。等待在这些命令前面,我得到“await运算符只能与async一起使用”方法。
var auth = new PinAuthorizer()
{
CredentialStore = new InMemoryCredentialStore
{
ConsumerKey = ConfigurationManager.AppSettings["consumerKey"],
ConsumerSecret = ConfigurationManager.AppSettings["consumerSecret"]
},
GoToTwitterAuthorization = pageLink => Process.Start(pageLink),
GetPin = () =>
{
return (string)Interaction.InputBox("Enter Pin", "Twitter", string.Empty, 10, 10);
}
};
await auth.AuthorizeAsync();
如果我删除await,我可以运行它,但它只是从那里级联:
using (var twitterCtx = new TwitterContext(auth))
{
twitterCtx.TweetAsync("Test from thread");
}
不会抛出异常......
我试过把它放在自己的线程中,没有任何区别。我尝过像
这样的东西Task task = twitterCtx.TweetAsync("Test from thread");
task.Wait();
什么都没有用。该项目是4.5 vs2013。 LinqToTwitterPlc.dll 3.1.2,LinqToTwitter.AspNet.dll 3.1.2
答案 0 :(得分:0)
控制台应用没有同步上下文,因此您必须在Main中阻止。这不是问题,因为关注其他应用程序中的阻塞是因为他们有一个可能导致死锁的UI线程,但对于Console应用程序则不然。您可以查看downloadable demos示例。以下是LINQ to Twitter中控制台演示的工作原理:
static void Main()
{
try
{
Task demoTask = DoDemosAsync();
demoTask.Wait();
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
Console.Write("\nPress any key to close console window...");
Console.ReadKey(true);
}
从那里剩下的代码是异步的,如下所示:
static async Task DoDemosAsync()
{
// ...
}
如果你想要一个同步上下文和/或你不喜欢在任何类型的应用程序中阻塞,AsyncEx(以前的Nito.Async)是一个很好的库。