内联函数是一种编译器优化,它将函数调用站点替换为被调用者的主体.常规C#函数支持此优化.
在C#5.0 中支持async-await模式的异步函数有一个特殊的声明,它涉及async修饰符和包装返回值Task<>.
异步函数也可以内联吗?
例:
假设我有这些功能:
private async Task<int> CalleeAsync() {
return await SomeOperationAsync();
}
private async Task<int> CallerAsync() {
return await CalleeAsync();
}
Run Code Online (Sandbox Code Playgroud)
他们可以优化为:
private async Task<int> CallerAsync() {
return await SomeOperationAsync();
}
Run Code Online (Sandbox Code Playgroud)
额外信用:
如果支持,谁可以决定内联什么?编译器?JIT?我?
如果它不受支持,我应该担心这个并避免过多的包装我有时会添加以便于阅读吗?
根据设计,Android应用程序在可以使用的堆内存量方面非常有限.旧设备上SDK应用程序的限制只有16MB.这种设计选择通常是有意义的,因为操作系统试图在通常内存非常低的设备上支持多任务处理 - 因此每个任务都有自己的小配给.
内存限制因设备而异.以三星Galaxy S2为例,每个应用程序的介于32MB-64MB之间.该设备具有1GB的RAM,因此单个任务只能使用设备可提供的5%左右.
值得一提的是iOS上的内存策略是非常不同的.据我所知,iOS应用程序可以使用多少内存没有外部强制限制.您可以根据需要分配,直到系统内存不足.如果你太贪心,其他后台应用程序将被终止.
让我们解决这个问题 - 这不是关于哪种内存策略更好的讨论.
对于某些类型的应用程序,Android上的内存限制很难实现.图形密集型应用程序(如游戏)需要大量内存来保存位图.即使是Web浏览器也很难在默认限制下实现.
当资源优化不够时,克服内存限制的标准策略是使用NDK.Android中的"本机"堆没有人为限制,其行为与iOS上的堆非常相似.使用"本地"堆来保存位图效果很好-这实际上是位图是如何被保存在Android 2.3.3和更低(在JVM仍限于这些人为虽然).
我正在寻找一个NDK + JNI库来保存"本机"堆中的无限位图.它的Java接口应该与stock位图API相同.我不知道为此目的的任何公共项目,并将感谢您的帮助,找到一个.如果您之前已实现此功能并愿意共享您的代码,那么也将不胜感激.
最后评论:请不要讨论将公共图书馆提供给公众的道德问题.
android memory-management bitmap static-libraries android-ndk
的异步-等待模式是更强大的补充.NET 4.5和C#5.0中的一个
据我所知,它目前仅在C#和VB中可用.
此API是.NET CLR还是C#编译器本身的功能?
我真正要问的是 - 我们是否应该期望在其他.NET语言中使用async/await,例如:
请注意,我不要求对一般的异步编程,但关于异步等待模式(这是写异步代码的细节同步).
我的代码正在对需要基本身份验证的Web服务URL进行HTTP GET。
我用这个来实现HttpClient与HttpClientHandler具有Credentials定义的属性。
这一切都很好。.除了我的一个用例中,我将经过身份验证的GET发送到:
http://somedomain.com重定向到http://www.somedomain.com。
似乎HttpClientHandler在重定向过程中清除了身份验证标头。我该如何预防?我希望无论重定向如何都发送凭据。
这是我的代码:
// prepare the request
var request = new HttpRequestMessage(method, url);
using (var handler = new HttpClientHandler { Credentials = new NetworkCredential(username, password) , PreAuthenticate = true })
using (var client = new HttpClient(handler))
{
// send the request
var response = await client.SendAsync(request);
Run Code Online (Sandbox Code Playgroud)
注意:这是一个相关的问题: 重定向时保持HTTP基本身份验证有效, 但是由于我使用不同的类进行请求,因此可能会有更好,更具体的解决方案
我正在使用Azure云,并尝试实现主要是IO绑定的可伸缩HTTP服务器。
澄清:举个例子,假设服务器是一个“ blob代理”,即客户端连接,服务器从Azure存储下载一个blob并将其流式传输到客户端。而已。
我的目标当然是从一台计算机上压缩最多的并发客户端。
向node.js学习
看来node.js非常适合此类问题。服务器只做IO。节点是完全异步的,在一台计算机上可能达到10,000个并发。
我最终选择了使用node.js来支持c#和.net框架,并且我正在尝试实现与c#所提供的功能类似的策略。我不是要复制节点-只是复制它的方法。
我在Azure上的C#实现
目前,我有一个Azure云服务,其中包含IIS上的瘦Web角色。这里是MyHandler.ashx:
public class MyHandler : HttpTaskAsyncHandler
{
public override async Task ProcessRequestAsync(HttpContext context)
{
CloudBlockBlob blob = GetBlockBlobReference(...);
await blob.DownloadToStreamAsync(context.Response.OutputStream);
}
}
Run Code Online (Sandbox Code Playgroud)
我的路由很简单Web.config:
<system.webServer>
<handlers>
<add verb="*" path="*" name="MyHandler" type="MyWebRole.MyHandler" />
</handlers>
</system.webServer>
Run Code Online (Sandbox Code Playgroud)
讨论:
我希望.net 4.5的新async / await API与node.js中的JS一样异步,并且非常易于使用。这个假设有什么严重的错误吗?
为了使并发数量最大化,应该对Azure Web角色进行哪些调整/优化?
我听说我必须增加最大连接数,因为它默认仅为12 * num核心。这是真的,它是如何做到的?
我应该做些什么来更改默认线程池吗?
还有其他重要提示/调整/优化吗?
我应该完全删除IIS吗?我可以在工作角色中托管一些“更精简”的服务器实现。相对于IIS,这能否显着提高性能?值得麻烦吗?
总的来说,我走对了吗?有没有更好的方法用c#/。net做到这一点?
.net ×4
c# ×3
async-await ×2
android ×1
android-ndk ×1
asynchronous ×1
azure ×1
bitmap ×1
clr ×1
iis ×1
node.js ×1
optimization ×1
redirect ×1