小编tal*_*kol的帖子

可以内联异步函数吗?

内联函数是一种编译器优化,它将函数调用站点替换为被调用者的主体.常规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?我?

如果它不受支持,我应该担心这个并避免过多的包装我有时会添加以便于阅读吗?

.net c# optimization asynchronous async-await

6
推荐指数
1
解决办法
398
查看次数

用于在Android上使用NDK的位图的无限制堆内存的库

根据设计,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

5
推荐指数
1
解决办法
1809
查看次数

除了C#之外,其他.NET语言中是否可以使用async-await?

异步-等待模式是更强大的补充.NET 4.5和C#5.0中的一个

据我所知,它目前仅在C#和VB中可用.

此API是.NET CLR还是C#编译器本身的功能?

我真正要问的是 - 我们是否应该期望在其他.NET语言中使用async/await,例如:

  • C++(通过C++/CLI)
  • Python(通过IronPython)
  • PHP(通过Phalanger)
  • JavaScript(通过IronJS)

请注意,我不要求对一般的异步编程,但关于异步等待模式(这是写异步代码的细节同步).

.net c# clr async-await

5
推荐指数
1
解决办法
2012
查看次数

C#HttpClient重定向后未发送基本身份验证

我的代码正在对需要基本身份验证的Web服务URL进行HTTP GET。

我用这个来实现HttpClientHttpClientHandler具有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基本身份验证有效, 但是由于我使用不同的类进行请求,因此可能会有更好,更具体的解决方案

.net c# authentication redirect dotnet-httpclient

5
推荐指数
1
解决办法
3281
查看次数

使用c#和.net实现可扩展的类似于node.js的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)

讨论:

  1. 我希望.net 4.5的新async / await API与node.js中的JS一样异步,并且非常易于使用。这个假设有什么严重的错误吗?

  2. 为了使并发数量最大化,应该对Azure Web角色进行哪些调整/优化?

    • 我听说我必须增加最大连接数,因为它默认仅为12 * num核心。这是真的,它是如何做到的?

    • 我应该做些什么来更改默认线程池吗?

    • 还有其他重要提示/调整/优化吗?

  3. 我应该完全删除IIS吗?我可以在工作角色中托管一些“更精简”的服务器实现。相对于IIS,这能否显着提高性能?值得麻烦吗?

  4. 总的来说,我走对了吗?有没有更好的方法用c#/。net做到这一点?

.net iis azure node.js azure-web-roles

4
推荐指数
1
解决办法
2605
查看次数