在C#中从getter或setter调用异步方法最优雅的方法是什么?
这里有一些伪代码可以帮助解释自己.
async Task<IEnumerable> MyAsyncMethod()
{
return await DoSomethingAsync();
}
public IEnumerable MyList
{
get
{
//call MyAsyncMethod() here
}
}
Run Code Online (Sandbox Code Playgroud) 我现在开始创建一个可以从C#5的async-await功能中获益的应用程序.但我不确定使用哪个版本的VS和async运行时.
看看操作系统受欢迎程度图表,我需要再支持Windows XP三年左右.看起来.net 4.5仅在较新版本的Windows上运行,因此我需要以.net 4.0为目标.开发机器使用Windows 7,因此使用较新版本的VS不是问题.
现在我需要先选择一个编译器来执行此操作:
哪一个代码生成错误较少?看看Jon Skeet的博客,VS2012 Preview使用的是永不代码生成器而不是CTP.
更重要的是使用哪个运行时?
VS2012是否包含可再发行的异步运行时与.net 4一起使用?
通过引用AsyncCTP运行时,我设法通过预览编译代码.但由于CTP具有奇怪的许可条件,这看起来不是一个好的长期解决方案.
或者我应该使用第三方实施?也许单声道有一个?
为了分发库,我更喜欢将dll放在与应用程序相同的目录中,而不是某种安装程序.
如果我的二进制文件在单声道+ Linux/MacOS上没有变化的情况下工作,我也会喜欢它.因此运行时应该与内置的任何单声道(可能是2.12)兼容,或者允许在非Windows操作系统上使用.
在查看各种C#异步CTP示例时,我看到一些返回的异步函数void,以及其他返回非泛型函数的异步函数Task.我可以看到为什么返回a Task<MyType>对于在异步操作完成时将数据返回给调用者很有用,但是我看到的返回类型的函数Task永远不会返回任何数据.为什么不回来void?
// let's say there is a list of 1000+ URLs
string[] urls = { "http://google.com", "http://yahoo.com", ... };
// now let's send HTTP requests to each of these URLs in parallel
urls.AsParallel().ForAll(async (url) => {
var client = new HttpClient();
var html = await client.GetStringAsync(url);
});
Run Code Online (Sandbox Code Playgroud)
这是问题所在,它会同时启动1000多个Web请求.有没有一种简单的方法来限制这些异步http请求的并发数量?这样在任何给定时间都不会下载超过20个网页.如何以最有效的方式做到这一点?
请有人能够确认我是否正确理解了Async await关键字吗?(使用CTP的第3版)
到目前为止,我已经解决了在方法调用之前插入await关键字基本上做了两件事,A.它创建一个立即返回和B.它创建一个"延续",在完成异步方法调用时调用.在任何情况下,continuation都是该方法的代码块的其余部分.
所以我想知道的是,这两位代码在技术上是等价的,如果是这样,这基本上意味着await关键字与创建ContinueWith Lambda相同(即:它基本上是一个编译器快捷方式)?如果没有,有什么区别?
bool Success =
await new POP3Connector(
"mail.server.com", txtUsername.Text, txtPassword.Text).Connect();
// At this point the method will return and following code will
// only be invoked when the operation is complete(?)
MessageBox.Show(Success ? "Logged In" : "Wrong password");
Run Code Online (Sandbox Code Playgroud)
VS
(new POP3Connector(
"mail.server.com", txtUsername.Text, txtPassword.Text ).Connect())
.ContinueWith((success) =>
MessageBox.Show(success.Result ? "Logged In" : "Wrong password"));
Run Code Online (Sandbox Code Playgroud) 在荷兰的Techdays期间,Steve Sanderson发表了关于C#5,ASP.NET MVC 4和异步Web的演讲.
他解释说,当请求需要很长时间才能完成时,线程池中的所有线程都会变忙,新请求必须等待.服务器无法处理负载,一切都变慢了.
然后,他展示了如何使用异步webrequests提高性能,因为然后将工作委托给另一个线程,并且线程池可以快速响应新的传入请求.他甚至演示了这一点,并显示50个并发请求首先占用了50*1,但异步行为总共只有1,2 s.
但看到这一点后,我仍然有一些问题.
为什么我们不能只使用更大的线程池?是不是使用async/await来启动另一个线程,然后从头开始增加线程池?它不像我们运行的服务器突然获得更多的线程或东西?
用户的请求仍在等待异步线程完成.如果池中的线程正在执行其他操作,那么"UI"线程如何保持忙碌状态?史蒂夫提到了一个关于'一个知道什么时候完成的智能内核'的东西.这是如何运作的?
想想这个,
Task task = new Task (async () =>{
await TaskEx.Delay(1000);
});
task.Start();
task.Wait();
Run Code Online (Sandbox Code Playgroud)
调用task.Wait()不等待任务完成,下一行立即执行,但如果我将async lambda表达式包装到方法调用中,代码将按预期工作.
private static async Task AwaitableMethod()
{
await TaskEx.Delay(1000);
}
Run Code Online (Sandbox Code Playgroud)
然后(根据svick的评论更新)
await AwaitableMethod();
Run Code Online (Sandbox Code Playgroud) 在新的异步dotnet 4.5库中是否有办法在Task.WhenAll方法上设置超时.我想获取几个源并在说5秒后停止并跳过未完成的源.
客户
iGame Channel = new ChannelFactory<iGame> ( new BasicHttpBinding ( BasicHttpSecurityMode . None ) , new EndpointAddress ( new Uri ( "http://localhost:58597/Game.svc" ) ) ) . CreateChannel ( );
public Task<SerializableDynamicObject> Client ( SerializableDynamicObject Packet )
{
return Task<SerializableDynamicObject> . Factory . FromAsync ( Channel . BeginConnection , Channel . EndConnection , Packet , null );
}
Run Code Online (Sandbox Code Playgroud)
合同
[OperationContract ( AsyncPattern = true )]
IAsyncResult BeginConnection ( SerializableDynamicObject Message , AsyncCallback Callback , object State );
SerializableDynamicObject EndConnection ( IAsyncResult …Run Code Online (Sandbox Code Playgroud) 浏览频道9 msdn视频我发现以下未答复的评论,希望有人可以解释一下吗?
我不明白async关键字.为什么不在方法返回Task时随时允许await关键字,就像迭代器可以在任何返回IEnumerable的方法上产生返回一样.
我确信有充分的理由,我只是想明白为什么上述建议是不可能的.
async-ctp ×10
c# ×10
async-await ×5
asynchronous ×4
.net ×2
.net-4.0 ×1
asp.net ×1
c#-5.0 ×1
return-type ×1
wcf ×1