小编Wou*_*ort的帖子

为什么要使用异步请求而不是使用更大的线程池?

在荷兰的Techdays期间,Steve Sanderson发表了关于C#5,ASP.NET MVC 4和异步Web的演讲.

他解释说,当请求需要很长时间才能完成时,线程池中的所有线程都会变忙,新请求必须等待.服务器无法处理负载,一切都变慢了.

然后,他展示了如何使用异步webrequests提高性能,因为然后将工作委托给另一个线程,并且线程池可以快速响应新的传入请求.他甚至演示了这一点,并显示50个并发请求首先占用了50*1,但异步行为总共只有1,2 s.

但看到这一点后,我仍然有一些问题.

  1. 为什么我们不能只使用更大的线程池?是不是使用async/await来启动另一个线程,然后从头开始增加线程池?它不像我们运行的服务器突然获得更多的线程或东西?

  2. 用户的请求仍在等待异步线程完成.如果池中的线程正在执行其他操作,那么"UI"线程如何保持忙碌状态?史蒂夫提到了一个关于'一个知道什么时候完成的智能内核'的东西.这是如何运作的?

c# asp.net asynchronous async-ctp

66
推荐指数
3
解决办法
1万
查看次数

异步单元测试中的Stubbing Task返回方法

假设我有以下类和它依赖的接口:

public class MyController
{
    private IRepository _repository;
    public MyController(IRepository repository)
    {
        _repository = repository;
    }

    public async Task MethodUnderTest(int someId)
    {
        var o = await _repository.FindById(someId);
        // update o
        await _repository.Commit();
    }
}

public interface IRepository
{
    Task Commit();
}
Run Code Online (Sandbox Code Playgroud)

当我对这个方法进行单元测试时,我可以执行以下操作(使用xUnit和Rhino Mocks):

[Fact]
public async Task MyTest()
{
    IRepository repositoryStub = MockRepository.GenerateStub<IRepository>();

    MyController controller = new MyController(repositoryStub);

    await controller.MethodUnderTest(1);
}
Run Code Online (Sandbox Code Playgroud)

这会因System.NullReferenceException而失败:对象引用未设置为对象的实例.

使用以下StackTrace:

UnitTest.MyController.<MethodUnderTest>d__0.MoveNext() in 
\UnitTest\Class1.cs:line 35
--- End of stack trace from previous location where …
Run Code Online (Sandbox Code Playgroud)

c# unit-testing task-parallel-library async-await

26
推荐指数
2
解决办法
2万
查看次数

在WinForms上使用async/await访问Task.Run中的UI控件

我在WinForms应用程序中有以下代码,只有一个按钮和一个标签:

using System;
using System.IO;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private async void button1_Click(object sender, EventArgs e)
        {
            await Run();
        }

        private async Task Run()
        {
            await Task.Run(async () => {
                await File.AppendText("temp.dat").WriteAsync("a");
                label1.Text = "test";
            });    
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我正在研究的实际应用程序的简化版本.我的印象是,通过在我使用async/await Task.Run我可以设置label1.Text属性.但是,当运行此代码时,我得到错误,我不在UI线程上,我无法访问该控件.

为什么我无法访问标签控件?

c# winforms task-parallel-library async-await

23
推荐指数
5
解决办法
5万
查看次数

WebApplicationFactory 抛出 ASP.NET Core 集成测试中不存在 contentRootPath 的错误

我有一个 ASP.NET Core 项目,其中包含一些简单的 Razor 页面和一个 Web API 控制器。

我使用Clean Architecture作为起点。我重命名了项目名称,删除了 MVC 内容并添加了一些我自己的代码。一切正常运行。

但是,集成测试在调用时会抛出以下错误factory.CreateClient()

Test Name:  ToDo.Tests.Integration.Web.HomeControllerIndexShould.ReturnViewWithCorrectMessage
Test FullName:  ToDo.Tests.Integration.Web.HomeControllerIndexShould.ReturnViewWithCorrectMessage
Test Source:    C:\Source\Utopia\tests\ToDo.Tests\Integration\Web\HomeControllerIndexShould.cs : line 18
Test Outcome:   Failed
Test Duration:  0:00:00,001

Result StackTrace:  
at Microsoft.AspNetCore.Hosting.Internal.HostingEnvironmentExtensions.Initialize(IHostingEnvironment hostingEnvironment, String contentRootPath, WebHostOptions options)
   at Microsoft.AspNetCore.Hosting.WebHostBuilder.BuildCommonServices(AggregateException& hostingStartupErrors)
   at Microsoft.AspNetCore.Hosting.WebHostBuilder.Build()
   at Microsoft.AspNetCore.TestHost.TestServer..ctor(IWebHostBuilder builder, IFeatureCollection featureCollection)
   at Microsoft.AspNetCore.Mvc.Testing.WebApplicationFactory`1.CreateServer(IWebHostBuilder builder)
   at Microsoft.AspNetCore.Mvc.Testing.WebApplicationFactory`1.EnsureServer()
   at Microsoft.AspNetCore.Mvc.Testing.WebApplicationFactory`1.CreateDefaultClient(DelegatingHandler[] handlers)
   at Microsoft.AspNetCore.Mvc.Testing.WebApplicationFactory`1.CreateClient(WebApplicationFactoryClientOptions options)
   at ToDo.Tests.Integration.Web.HomeControllerIndexShould..ctor(CustomWebApplicationFactory`1 factory) in C:\Source\Utopia\tests\ToDo.Tests\Integration\Web\HomeControllerIndexShould.cs:line 14
Result Message: 
System.ArgumentException : The content root 'C:\Source\Utopia\ToDo.Web' …
Run Code Online (Sandbox Code Playgroud)

c# integration-testing asp.net-core

16
推荐指数
5
解决办法
7709
查看次数

Console.ReadKey与带有Timer的Console.ReadLine

以下代码是一个众所周知的示例,用于显示调试版本和发布版本之间的区别:

using System;
using System.Threading;

public static class Program
{
    public static void Main()
    {
        Timer t = new Timer(TimerCallback, null, 0, 2000);
        Console.ReadLine();
    }

    private static void TimerCallback(Object o)
    {
        Console.WriteLine("In TimerCallback: " + DateTime.Now);
        GC.Collect();
    }
}
Run Code Online (Sandbox Code Playgroud)

如果使用调试配置运行此命令,则计时器将每两秒输出当前时间.这GC.Collect没有任何影响,因为编译器人为地延长了Timer t变量的寿命.在发布配置中,计时器只执行一次.该GC.Collect遗嘱垃圾收集t变量,就是这样.

一切都像它应该的那样.奇怪的是,当您将Console.ReadLine行更改为Console.ReadKey时,两个配置每两秒运行一次计时器.

Console.ReadKey和Console.ReadLine有什么区别?我从文档中了解到Console.ReadKey阻塞了发出ReadKey方法的线程.但是GC.Collect仍然会发射..

为什么Timer t通过阻塞主线程来延长生命周期?

更新

使用.NET 3.5时,不会发生此行为!

c# console multithreading garbage-collection timer

13
推荐指数
1
解决办法
4278
查看次数

采用DateTimeOffset的表达式会导致Visual Studio内部编译器错误

我试图模拟一个接口,它接受一个DateTimeOffset?参数.突然之间,Visual Studio开始报告"内部编译器错误"并且它已"停止工作".经过大量的试验,我开始逐个删除文件,然后逐行编码.这减少到下面的代码,它重现了这个错误:

public class testClass
{
    public interface ITest
    {
        void Test(DateTimeOffset? date);
    }

    public void test2()
    {
        var mock = new Mock<ITest>();
        mock.Setup(x => x.Test(new DateTime(2012, 1, 1)));
    }
}
Run Code Online (Sandbox Code Playgroud)

问题似乎是这样的:

mock.Setup(x => x.Test(new DateTime(2012, 1, 1)));
Run Code Online (Sandbox Code Playgroud)

如果我评论它,编译器工作正常.此外,问题是我正在设置一个new DateTime()适合的DateTimeOffset.

这是一个错误Moq,还是VS2012?以前有人遇到过这个错误吗?

UPDATE

以下代码示例也导致编译错误,包括常规Visual Studio 2012编译器和2012年9月Roslyn CTP:

using System;
using System.Linq.Expressions;

public interface ITest
{
    void Test(DateTimeOffset? date);
}

public class TestClass
{
    Expression<Action<ITest>> t = x => x.Test(new DateTime(2012, 1, …
Run Code Online (Sandbox Code Playgroud)

c# compiler-errors visual-studio roslyn visual-studio-2012

7
推荐指数
2
解决办法
688
查看次数

检查计算机是否通过Wake On Lan激活

我正在开发一种解决方案,通过Wake On Lan激活机器,然后System Center将更新推送到客户端PC(运行Windows 7).

现在我正在使用脚本(PowerShell/C#),它检查更新完成后是否应该关闭机器.

如果通过Wake On Lan激活机器并且自激活后没有用户登录机器,则可以安全地关闭机器.否则,机器应该继续.

有没有办法检查计算机是如何激活的?

c# powershell wake-on-lan

7
推荐指数
1
解决办法
2035
查看次数

如何将 AzureDefaultCredentials 与 Azure Fluent 结合使用?

我正在尝试在 C# 中创建一个重新生成存储密钥的 Azure 函数。我正在努力寻找正确的 .NET 库,在其中我可以验证并重新生成密钥。

我发现进行身份验证的最简单方法是使用DefaultAzureCredentials并将它们传递给BlobClient. 但我在 上找不到重新生成密钥的选项BlobClient

我发现在存储帐户上重新生成密钥的唯一方法是使用,Microsoft.Azure.Management.Fluent但 Fluent API 不支持DefaultAzureCredentials. 相反,我认为我需要使用SdkContext.AzureCredentialsFactory没有托管身份和 VS Code 的自动回退功能的工具DefaultCredentials

  • 有什么方法可以重新生成密钥BlobClient以便我可以使用吗DefaultAzureCredentials
  • DefaultAzureCredentials或者有没有办法与 Fluent API 一起使用?

.net c# azure azure-storage azure-authentication

6
推荐指数
2
解决办法
2103
查看次数

无法在 Ubuntu 上启动 Visual Studio Code

我正在使用 Ubuntu 14.04 在 Azure 中运行 VM。我已经安装了 XFCE 并使用 X2GO 远程桌面到机器。

我已经下载了 VS Code 并解压缩了文件。当我从终端运行代码时,出现以下错误:

WouterDeKort@UbuntuDev:~/tools/web/visual-studio-code$ ./Code 
bash: cannot set terminal process group (-1): Inappropriate ioctl for device
bash: no job control in this shell
WouterDeKort@UbuntuDev:~/tools/web/visual-studio-code$ [ , [Error: channel closed] ]
Run Code Online (Sandbox Code Playgroud)

知道我做错了什么吗?

免责声明 ;-) 我是一个完整的 Linux 新手。我今天第一次安装了 Linux,我不知道我在做什么 ;-)

linux ubuntu visual-studio-code

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

类型为"bind"的装入配置无效:尝试在Docker for Windows上运行容器时,绑定源路径不存在

我正在尝试使用Windows上的Docker 在https://docs.docker.com/engine/admin/prometheus/#use-prometheus上运行Prometheus示例.我正在执行以下命令:

docker service create --replicas 1 --name my-prometheus `
   --mount type=bind,source="C:/temp/prometheus.yml",destination=/etc/prometheus/prometheus.yml `
   --publish published=9090,target=9090,protocol=tcp `
   prom/prometheus
Run Code Online (Sandbox Code Playgroud)

错误是:类型"bind"的无效安装配置:绑定源路径不存在

我非常确定该文件存在(Test-PathPowerShell返回true).

知道我做错了什么吗?

更新

运行相同的命令mount type = volume会给我以下错误:

C:/temp/prometheus.yml"包含本地卷名的无效字符,仅允许"[a-zA-Z0-9] [a-zA-Z0-9 _.-]".如果您打算通过主机目录,使用绝对路径"

我正在传递一个主机目录,"C:/temp/prometheus.yml"是一个绝对路径.

powershell docker prometheus docker-for-windows

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