Task.Delay()没有按预期运行,或者说我不理解它应该做什么.我正试图Task在C#中解决问题,以及如何Thread在我的实现中替换s.
我想要做的是这样的事情:
我已经通过Threads很好地实现了,但是所有很酷的孩子都说我应该使用Task,而不要触摸Thread.
所以对于代码我有这个(忽略[Test]- 这只是一种方便的尝试方法)
[Test]
public void ChattyTask()
{
var chattyTask = new Task(ChattyWriter);
chattyTask.Start();
chattyTask.Wait();
}
public void ChattyWriter()
{
int count = 0;
while (true)
{
var message = String.Format("Chatty Writer number {0}", count);
Trace.WriteLine(message);
count++;
Task.Delay(1000);
if (count >= 20)
{
break;
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我运行它时,测试以毫秒为单位完成,而不是像我期望的那样在20秒内完成.如果我更换Task.Delay()用Thread.Sleep(),一切正常,我也得到了一次打印第二.我试过添加async和await进入ChattyWriter(),但不仅它没有添加1秒延迟,它只打印一行而不是20行.
我究竟做错了什么?
可能它有助于描述我正在做的事情:我的项目使用外部API(RESTful),在我请求执行某些任务之后,我需要轮询API以检查任务是否已完成.外部任务可以长时间运行:1-15分钟.所以我需要在检查完成之间有一些延迟.并且可能有许多不同的并发进程与多个外部任务一起执行.我明白,如果我Thread.Sleep()在轮询时使用,那么同样的其他进程Thread将被阻止,没有充分的理由.
我们正在使用Azure Web服务(而不是Web站点)并在其中运行ASP.Net MVC 5.1应用程序.
当我通过Web部署发布网站时,我可以选择"在发布期间预编译":

当我发布到Azure Web服务时,我无法在任何地方找到此选项.有什么指针吗?
这个想法是预先编译视图,所以首先点击一个视图不会因为动态编译而受到时间的影响.
我看过Razor Generator,但它不适合我们的需求.我见过很少的其他选项,但在发布阶段编译视图对我们的案例最有意义.
UPD: 仅供我参考,我已经尝试了David Ebbo建议的内容 ,但它没有用.
我在Visual Studio Online中享受新的Build工具.允许我做几乎我做本地构建服务器的所有事情.但是我缺少的一件事是集成数据库测试:对于每次构建运行,我都会从脚本重新创建测试数据库并对其进行数据库测试.
在Visual Studio Online中,我似乎无法找到满足我需求的任何数据库实例.
我尝试为每次构建运行创建Azure SQL数据库(通过PowerShell),然后在构建完成后删除它.但是创建数据库需要永远(与构建过程的其余部分相比).即使完成PowerShell脚本,数据库还没有准备好接受请求 - 我需要不断检查它是否真的准备好了.因此,这种情况变得过于复杂且不可靠.
是否有其他选项可以在Visual Studio Online中进行数据库(SQL Server)集成测试?
更新:我想我不太清楚我需要什么 - 我需要一个免费的(非常便宜的)SQL Server实例来连接到在VSO中的构建代理上运行的实例.像SQL Express或SQL CE或LocalDB之类的东西,我可以连接到它并重新创建数据库来运行C#测试.重新创建数据库或运行测试不是问题,拥有有效的连接字符串是一个问题.
UPD:这是我实现的这个问题的解决方案
我正在尝试通过Azure.Storage库(不是REST API)上传到Azure blob存储,并通过共享访问密钥进行身份验证.
我看过这篇博文,但是自帖子以来API已经发生了变化,现在我无法得到相同的结果.
这是我有的:
var blobClient = new CloudBlobClient(new Uri(blobWithSas.BaseUri), new StorageCredentials(blobWithSas.Sas));
// here I receive 404 error
var blob = blobClient.GetBlobReferenceFromServer(new Uri(blobWithSas.AbsoluteUri));
using (var stream = new FileStream(fullFilePath, FileMode.Open))
{
blob.UploadFromStream(stream);
}
Run Code Online (Sandbox Code Playgroud)
有:
blobWithSas.BaseUri= http://127.0.0.1:10000/devstoreaccount1/a6dc9274-6ce1-4095-be6b-e84d1012cb24(Guid是容器的名称,已存在,在其他地方创建.)
blobWithSas.Sas= ?sv=2012-02-12&se=2013-06-23T03%3A04%3A53Z&sr=b&sp=w&sig=NaMqgXRMXDFvLAp8LTskgplAKp%2B9LCZzq8WK9Zo35x8%3D(也在代码中的其他地方发布)
blobWithSas.AbsoluteUri = http://127.0.0.1:10000/devstoreaccount1/a6dc9274-6ce1-4095-be6b-e84d1012cb24/foldername/filename.txt
blob不存在,我想上传新文件并创建一个blob.我有"服务器"应用程序持有Azure存储帐户的访问密钥.服务器将向客户端发出SAS,客户端将文件直接上载到Azure.所以SAS只会写,没有阅读,客户端将创建服务器告诉他们的文件(容器,文件夹名称)
问题出现了GetBlobReferenceFromServer- 我从Azure存储中收到404错误.是的,blob不存在且没有引用.因此,给定CloudBlobClient,如何将文件上传到blob?
ps我意识到这些东西有REST API.但我之前使用过Microsoft.WindowsAzure.Storage库,如果可能的话,我希望避免使用REST服务.
我有简单的vanilla MVC4网络项目.没有添加,没有删除,只是在Visual Studio中创建了一个新项目.
在web.config我添加了自定义错误页面处理程序:
<customErrors mode="On" defaultRedirect="~/Content/Error.htm" redirectMode="ResponseRewrite" />
Run Code Online (Sandbox Code Playgroud)
并且~/Content/Error.htm文件是:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>OOPS! Error Occurred. Sorry about this.</title>
</head>
<body>
<h2>OOPS! Error Occurred</h2>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
每当我在网站上收到404错误时,Error.htm在Firefox和Chrome中作为纯文本提供:

Fiddler说错误页面没有content-type标题,导致浏览器将页面呈现为纯文本:

有没有办法强制IIS服务器错误页面的content-type头?
ps实际问题出在一个复杂的MVC4项目中,它在Global.asax中有自己的错误处理.但我发现有些错误不会通过ASP管道,只能由IIS处理.像网址末尾的点.使用<httpErrors />的解决方案确实提供了正确的响应,但我们在Global.asax,Application_Error()中的自定义错误处理不会以这种方式调用.
UPD似乎无法赢得这场战争.IE显示正确呈现的html,Firefox和Chrome显示为纯文本.当我切换到纯文本时,Firefox和IE正确显示空白区域,IE吞下白色空间并尝试渲染html.如果我尝试将图像作为错误页面提供,则Firefox和Chrome会显示图像.IE显示了这个:
捂脸!
我有一个带MVC的Asp.Net Core应用程序.我正在提交表格上有日期的表格.
表格看起来(大致)像这样:
@model EditCustomerViewModel
<form asp-action="Edit">
<input asp-for="ServiceStartDate" class="form-control" type="date" />
<input type="submit" value="Update" class="btn btn-success" />
</form>
Run Code Online (Sandbox Code Playgroud)
控制器动作是:
[HttpPost]
public async Task<IActionResult> Edit(EditCustomerViewModel viewModel)
{
// do stuff
return RedirectToAction("Index");
}
Run Code Online (Sandbox Code Playgroud)
查看模型是:
public class EditCustomerViewModel
{
public Guid Id { get; set; }
[DataType(DataType.Date)]
public DateTime ServiceStartDate { get; set; }
[DataType(DataType.Date)]
public DateTime? ServiceEndDate { get; set; }
// etc.
}
Run Code Online (Sandbox Code Playgroud)
我在英国,所以约会不是美国格式:dd/MM/YYYY.所以默认我提交6/22/2017.
在调试期间查看控制器中提交的视图模型时,如果以英国格式提交,则日期为空,但如果使用美国格式则可以.即6/22/2017给我null,但22/6/2017必然是正确的日期.
我试过添加它Startup.cs但它没有任何区别:
var …Run Code Online (Sandbox Code Playgroud) 免责声明:我理解这个问题非常基本,但是我无法在谷歌或这里找到答案,也无法通过猜测配置自行完成.
我想开始使用LINQPad,我在同一个域中的不同机器上安装了SQL Server 2005.但我无法从LINQPad连接到该服务器.
这是截图:

我把什么作为服务器字符串?
提前谢谢了!
更新1: SERVERNAME\MSSQLSERVER确实有所作为.而不是错误
26(找不到服务器实例)
我收到错误
25(连接字符串不正确)
我尝试了两种不同的SQL Server:生产服务器上的SQL 2005和本地机器上的Sql Server 2008 R2,我尝试过Windows身份验证和SQL身份验证.它没有任何区别.但我可以使用带有Windows和SQL服务器身份验证的MS SQL Server Management Studio连接到服务器(2005和2008).并且它不是SQL Server权限问题 - 我已经尝试过SA用户连接.它适用于sqlservermanagementstudio,但不适用于LINQPad.
有什么建议?我需要更改SQL Server上的设置吗?
更新2:我找到了问题的解决方案.进入Server字段我不得不SERVERNAME\指定SQLEXPRESS或MSSQLSERVER.
不是很直观=(
我已经开始使用一些其他开源项目作为依赖项的开源MVC4项目.我已经分叉了另一个项目,并将根据我的需要对其进行修改.我面临的问题是如何保持这些项目相互依赖,但需要单独维护.然而,git拉动我的项目的人也会得到依赖项目吗?
在这种情况下,您如何组织代码?
我们有MVC4项目与Entity Framework进行存储.对于我们的测试,我们最近开始使用Autofixture,它真的很棒.
我们的模型图非常深,通常通过AutoFixture创建一个对象创建整个图:人 - >团队 - >部门 - >公司 - >合同 - > ....等.
这个问题是时间问题.对象创建需要一秒钟.这导致测试缓慢.
我发现自己做了很多事情是这样的:
var contract = fixture.Build<PersonContract>()
.Without(c => c.Person)
.Without(c => c.PersonContractTemplate)
.Without(c => c.Occupation)
.Without(c => c.EmploymentCompany)
.Create<PersonContract>();
Run Code Online (Sandbox Code Playgroud)
这很有效,而且很快.但是这种过度规范使得测试难以阅读,有时我会忽略重要的细节,就像.With(c => c.PersonId, 42)在不重要的列表中一样.Without().
所有这些被忽略的对象都是Entity Framework的导航属性,并且都是虚拟的.
是否有一种全局方式告诉AutoFixture忽略虚拟成员?
我试过创造ISpecimentBuilder,但没有运气:
public class IgnoreVirtualMembers : ISpecimenBuilder
{
public object Create(object request, ISpecimenContext context)
{
if (request.GetType().IsVirtual // ?? this does not exist )
{
return null;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我似乎无法找到一种方法 …
我们在我们的应用程序中实践CQRS体系结构,即我们有许多类实现,ICommand并且每个命令都有处理程序:ICommandHandler<ICommand>.同样的方法也适用于数据检索-我们IQUery<TResult>有IQueryHandler<IQuery, TResult>.这些日子很常见.
一些查询经常被使用(对于页面上的多个下拉),并且缓存它们的执行结果是有意义的.所以我们有一个围绕IQueryHandler的装饰器来缓存一些查询执行.
查询实现接口ICachedQuery和装饰器缓存结果.像这样:
public interface ICachedQuery {
String CacheKey { get; }
int CacheDurationMinutes { get; }
}
public class CachedQueryHandlerDecorator<TQuery, TResult>
: IQueryHandler<TQuery, TResult> where TQuery : IQuery<TResult>
{
private IQueryHandler<TQuery, TResult> decorated;
private readonly ICacheProvider cacheProvider;
public CachedQueryHandlerDecorator(IQueryHandler<TQuery, TResult> decorated,
ICacheProvider cacheProvider) {
this.decorated = decorated;
this.cacheProvider = cacheProvider;
}
public TResult Handle(TQuery query) {
var cachedQuery = query as ICachedQuery;
if (cachedQuery == null)
return decorated.Handle(query); …Run Code Online (Sandbox Code Playgroud) c# ×7
asp.net-mvc ×2
azure ×2
architecture ×1
asp.net-core ×1
autofixture ×1
azure-devops ×1
caching ×1
cqrs ×1
data-binding ×1
database ×1
deployment ×1
github ×1
iis ×1
linqpad ×1
open-source ×1
precompile ×1
publishing ×1
sql-server ×1