小编tra*_*max的帖子

Task.Delay()的行为不符合预期

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(),一切正常,我也得到了一次打印第二.我试过添加asyncawait进入ChattyWriter(),但不仅它没有添加1秒延迟,它只打印一行而不是20行.

我究竟做错了什么?

可能它有助于描述我正在做的事情:我的项目使用外部API(RESTful),在我请求执行某些任务之后,我需要轮询API以检查任务是否已完成.外部任务可以长时间运行:1-15分钟.所以我需要在检查完成之间有一些延迟.并且可能有许多不同的并发进程与多个外部任务一起执行.我明白,如果我Thread.Sleep()在轮询时使用,那么同样的其他进程Thread将被阻止,没有充分的理由.

c# multithreading task-parallel-library

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

在Azure Web服务的发布期间进行预编译

我们正在使用Azure Web服务(而不是Web站点)并在其中运行ASP.Net MVC 5.1应用程序.

当我通过Web部署发布网站时,我可以选择"在发布期间预编译":

在此输入图像描述

当我发布到Azure Web服务时,我无法在任何地方找到此选项.有什么指针吗?

这个想法是预先编译视图,所以首先点击一个视图不会因为动态编译而受到时间的影响.

我看过Razor Generator,但它不适合我们的需求.我见过很少的其他选项,但在发布阶段编译视图对我们的案例最有意义.

UPD: 仅供我参考,我已经尝试了David Ebbo建议的内容 ,但它没有用.

deployment asp.net-mvc publishing azure precompile

15
推荐指数
1
解决办法
2148
查看次数

Visual Studio Online中的数据库集成测试

我在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#测试.重新创建数据库或运行测试不是问题,拥有有效的连接字符串是一个问题.

2016年10月更新: 我发表了关于如何在VSTS中进行集成测试的博文

database sql-server integration-testing azure-devops

15
推荐指数
2
解决办法
3946
查看次数

使用共享访问密钥上载到Azure Blob存储

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服务.

c# azure azure-storage azure-storage-blobs

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

IIS将自定义错误页面作为纯文本提供,没有内容类型标题

UPD:这是错误处理完整解决方案

我有简单的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中作为纯文本提供:

HTML显示为纯文本

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

没有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显示了这个: IE9正在破解! 捂脸!

c# iis error-handling asp.net-mvc-4

13
推荐指数
3
解决办法
7044
查看次数

如何在Asp.Net Core中设置日期绑定的文化?

我有一个带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)

c# data-binding globalization asp.net-mvc asp.net-core

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

将LINQPad连接到远程SQL Server

免责声明:我理解这个问题非常基本,但是我无法在谷歌或这里找到答案,也无法通过猜测配置自行完成.

我想开始使用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用户连接.它适用于,但不适用于LINQPad.

有什么建议?我需要更改SQL Server上的设置吗?

更新2:我找到了问题的解决方案.进入Server字段我不得不SERVERNAME\指定SQLEXPRESSMSSQLSERVER.
不是很直观=(

database-connection sql-server-2005 linqpad

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

如何使用开源依赖项组织开源Visual Studio项目?

我已经开始使用一些其他开源项目作为依赖项的开源MVC4项目.我已经分叉了另一个项目,并将根据我的需要对其进行修改.我面临的问题是如何保持这些项目相互依赖,但需要单独维护.然而,git拉动我的项目的人也会得到依赖项目吗?

  1. 我可以将所有相关代码从其他项目中抨击到我的存储库中,但这样我就无法为依赖项目的分支做出贡献.我将成为我的存储库的一部分.不是真的想那样做.
  2. 我可以完全单独维护其他项目,并将*.dll文件复制到我的项目中.并将依赖的dll文件提交到git中.这很好,但是我没有能力同时开发两个项目,同时在调试时踩到相关代码(好吧,如果复制*.pdb文件也可能没有)
  3. 与第2点类似,我可以从依赖项目构建nuget包并将它们添加到我的主项目中 - 再次,不能真正同时开发两个项目,需要切换上下文.
  4. 有一些魔术有一个解决方案文件,它结合了我的存储库和依赖存储库中的项目.在每个构建中,将依赖的dll文件复制到/ lib文件夹并提交它们.这样我就不需要在单独的项目之间切换上下文.但缺点是当其他贡献者git拉动我的项目时,他们不会得到依赖项目,并且解决方案文件可能会被破坏,因为它将引用不在repo中的项目.

在这种情况下,您如何组织代码?

c# open-source projects-and-solutions github

12
推荐指数
1
解决办法
1562
查看次数

忽略虚拟属性

我们有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)

我似乎无法找到一种方法 …

c# autofixture

12
推荐指数
1
解决办法
2630
查看次数

CQRS应用程序中的缓存失效

我们在我们的应用程序中实践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# architecture caching dependency-injection cqrs

12
推荐指数
1
解决办法
1795
查看次数