在荷兰的Techdays期间,Steve Sanderson发表了关于C#5,ASP.NET MVC 4和异步Web的演讲.
他解释说,当请求需要很长时间才能完成时,线程池中的所有线程都会变忙,新请求必须等待.服务器无法处理负载,一切都变慢了.
然后,他展示了如何使用异步webrequests提高性能,因为然后将工作委托给另一个线程,并且线程池可以快速响应新的传入请求.他甚至演示了这一点,并显示50个并发请求首先占用了50*1,但异步行为总共只有1,2 s.
但看到这一点后,我仍然有一些问题.
为什么我们不能只使用更大的线程池?是不是使用async/await来启动另一个线程,然后从头开始增加线程池?它不像我们运行的服务器突然获得更多的线程或东西?
用户的请求仍在等待异步线程完成.如果池中的线程正在执行其他操作,那么"UI"线程如何保持忙碌状态?史蒂夫提到了一个关于'一个知道什么时候完成的智能内核'的东西.这是如何运作的?
假设我有以下类和它依赖的接口:
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) 我在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线程上,我无法访问该控件.
为什么我无法访问标签控件?
我有一个 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) 以下代码是一个众所周知的示例,用于显示调试版本和发布版本之间的区别:
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时,不会发生此行为!
我试图模拟一个接口,它接受一个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?以前有人遇到过这个错误吗?
以下代码示例也导致编译错误,包括常规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) 我正在开发一种解决方案,通过Wake On Lan激活机器,然后System Center将更新推送到客户端PC(运行Windows 7).
现在我正在使用脚本(PowerShell/C#),它检查更新完成后是否应该关闭机器.
如果通过Wake On Lan激活机器并且自激活后没有用户登录机器,则可以安全地关闭机器.否则,机器应该继续.
有没有办法检查计算机是如何激活的?
我正在尝试在 C# 中创建一个重新生成存储密钥的 Azure 函数。我正在努力寻找正确的 .NET 库,在其中我可以验证并重新生成密钥。
我发现进行身份验证的最简单方法是使用DefaultAzureCredentials并将它们传递给BlobClient. 但我在 上找不到重新生成密钥的选项BlobClient。
我发现在存储帐户上重新生成密钥的唯一方法是使用,Microsoft.Azure.Management.Fluent但 Fluent API 不支持DefaultAzureCredentials. 相反,我认为我需要使用SdkContext.AzureCredentialsFactory没有托管身份和 VS Code 的自动回退功能的工具DefaultCredentials。
BlobClient以便我可以使用吗DefaultAzureCredentials?DefaultAzureCredentials或者有没有办法与 Fluent API 一起使用?我正在使用 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,我不知道我在做什么 ;-)
我正在尝试使用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"是一个绝对路径.
c# ×8
async-await ×2
powershell ×2
.net ×1
asp.net ×1
asp.net-core ×1
async-ctp ×1
asynchronous ×1
azure ×1
console ×1
docker ×1
linux ×1
prometheus ×1
roslyn ×1
timer ×1
ubuntu ×1
unit-testing ×1
wake-on-lan ×1
winforms ×1