小编Jon*_*Rea的帖子

如果我的接口必须返回Task,那么实现无操作的最佳方法是什么?

在下面的代码中,由于接口,类LazyBar必须从它的方法返回一个任务(并且为了参数而不能更改).如果LazyBars的实现是不寻常的,那么它恰好快速且同步地运行 - 从方法返回No-Operation任务的最佳方法是什么?

我已经在Task.Delay(0)下面了,但是我想知道如果这个函数被调用了很多(如果参数起见,比如说每秒数百次),这是否有任何性能副作用:

  • 这种语法糖会不会变成大事?
  • 它是否开始堵塞应用程序的线程池?
  • 编译器切割器是否足以以Delay(0)不同方式处理?
  • 请问return Task.Run(() => { });有什么不同?

有没有更好的办法?

using System.Threading.Tasks;

namespace MyAsyncTest
{
    internal interface IFooFace
    {
        Task WillBeLongRunningAsyncInTheMajorityOfImplementations();
    }

    /// <summary>
    /// An implementation, that unlike most cases, will not have a long-running
    /// operation in 'WillBeLongRunningAsyncInTheMajorityOfImplementations'
    /// </summary>
    internal class LazyBar : IFooFace
    {
        #region IFooFace Members

        public Task WillBeLongRunningAsyncInTheMajorityOfImplementations()
        {
            // First, do something really quick
            var x = 1; …
Run Code Online (Sandbox Code Playgroud)

.net c# threadpool task-parallel-library async-await

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

卡住非活动msbuild.exe进程,锁定Stylecop.dll,Nuget AccessViolationException和CI构建相互冲突的谜团

观察:

  • 在我们的Jenkins构建服务器上,我们看到很多msbuild.exe进程(~100)在作业完成后闲置,大约20mb内存使用率和0%CPU活动.

  • 使用不同版本的stylecop的构建间歇性地失败:

    workspace\packages\StyleCop.MSBuild.4.7.41.0\tools\StyleCop.targets(109,7): error MSB4131: The "ViolationCount" parameter is not supported by the "StyleCopTask" task. Verify the parameter exists on the task, and it is a gettable public instance property.

  • Nuget.exe 间歇性地退出,出现以下访问冲突错误(0x0000005):

    .\workspace\.nuget\nuget install .\workspace\packages.config -o .\workspace\packages" exited with code -1073741819.

MsBuild通过Jenkins Matrix作业以下列方式启动,启用了"BuildInParallel":

    `msbuild /t:%Targets% /m
    /p:Client=%Client%;LOCAL_BUILD=%LOCAL_BUILD%;BUILD_NUMBER=%BUILD_NUMBER%;
    JOB_NAME=%JOB_NAME%;Env=%Env%;Configuration=%Configuration%;Platform=%Platform%;
    Clean=%Clean%; %~dp0\_Jenkins\Build.proj`
Run Code Online (Sandbox Code Playgroud)

msbuild stylecop nuget

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

.NET Core和.Net 4.5.2都使用的公共类库

我对.Net Core很新,但已经建立了一个有效的Asp.Net核心WebAPI站点 - 现在我想与另一个项目共享一些代码......

  • 我安装了Update Studio的Visual Studio 2015.
  • 我从这里安装了DotNetCore.1.0.0-VS2015Tools.Preview2.exe .

我想创建一个可以被其他两个库使用的共享库(PCL) - 它只包含没有其他依赖项的基本类/接口.其中一个消费库是一个针对"netstandard1.6"的新vanilla项目,另一个是针对.Net 4.5.2的旧客户端库(如果必须,我可以将其升级到4.6.x).

我已经圆圈了,我不能让netstandard1.6库引用PCL - 我只是被告知类型丢失了:

错误CS0246:找不到类型或命名空间名称'SomeTypeHere'(您是否缺少using指令或程序集引用?)

名为"ClassLibrary1"的project.json的PCL自动生成为:

{
  "supports": {},
  "dependencies": {
    "Microsoft.NETCore.Portable.Compatibility": "1.0.1",
    "NETStandard.Library": "1.6.0"
  },
  "frameworks": {
    "netstandard1.1": {}
  }
}
Run Code Online (Sandbox Code Playgroud)

我的消费库project.json是:

{
  "version": "1.0.0-*",
  "dependencies": {
    "NETStandard.Library": "1.6.0",
    "Newtonsoft.Json": "9.0.1"
  },
  "frameworks": {
    "netstandard1.6": {
      "dependencies": {
        "ClassLibrary1": {
          "target": "project"
        }
      }
    }
  }
}  
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

编辑07/07/2016:

我已经提供了以下解决方案,它演示了我的设置:https: //github.com/JonnyWideFoot/netcore-prototype 请参阅ExperimentClient :: GetLocationAsync我想在.Net 4.5.2/4.6中使用合同库的位置.x客户端.

.net portable-class-library .net-core

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

包含x86 ARM x64二进制文件的单个NuGet包

有没有办法制作一个包含针对x86 ARM x64等的二进制文件的NuGet包,以便VisStudio/MSBuild为每个给定的构建配置选择正确的二进制文件?

我只能看到对os目标的支持 - 即Windows,Windows8,win,win8,wp,wp7,WindowsPhone,WindowsPhone7,silverilght4-wp71,wp71,WindowsPhone71等.

你最终得到一个像这样的文件夹结构:

\content
    \net11
    \MyContent.txt
    \net20
        \MyContent20.txt
    \net40
    \sl40
        \MySilverlightContent.html

\tools
    init.ps1
    \net40
        install.ps1
        uninstall.ps1
    \sl40
        install.ps1
        uninstall.ps1
Run Code Online (Sandbox Code Playgroud)

我是否真的必须执行一些PowerShell脚本或预构建步骤才能完成此任务?看起来这应该是开箱即用的NuGet支持的吗?

如果我必须使用脚本 - 是否有人有良好的示例代码?一个ps1脚本或某种构建钩子?

我还在这个主题上找到了这个工作项:http://nuget.codeplex.com/workitem/679.但它自2011年6月以来一直存在,上次评论于7月份.

有任何想法吗?

非常感谢,乔恩

资料来源:

x86 windows-phone nuget windows-runtime

9
推荐指数
1
解决办法
2372
查看次数

C# 生产质量线程安全的内存中 LRU 缓存已过期?

这可能就像在棍子上求月亮一样;但是是否有“C# 生产质量线程安全的内存中 LRU 缓存与到期?或者有没有人有最佳实践的想法来实现同样的事情?

(LRU 是“最近最少使用” - http://en.wikipedia.org/wiki/Cache_algorithms#LRU

澄清一下:我想在具有以下接口的 ASP.Net MVC 站点中支持内存缓存:

public interface ICache
{
    T GetOrAdd<T>(string key, Func<T> create, TimeSpan timeToLive) where T : class;
    bool Remove(string key);
}
Run Code Online (Sandbox Code Playgroud)
  • 我想要“GetOrAdd”,因为我希望这些操作是“原子的”——即避免围绕试图同时查询缓存的两个线程的竞争条件
  • 我想要 Create 函数,因为创建这些对象很昂贵(需要复杂的数据库访问)
  • 我需要过期,因为这些对象会在一段时间后过期

Microsoft 的最佳解决方案似乎是“System.Runtime.Caching.MemoryCache”,但它似乎有几个警告:

  • 它需要定期轮询缓存以遵守强加的内存限制。我的系统中不可能出现内存不足的情况。我读过这篇文章,这让我很担心:MemoryCache 不遵守配置中的内存限制
  • 它似乎只有“AddOrGetExisting”来支持我的接口,它将构造的对象作为第二个参数——如果这个对象创建起来很昂贵,那么预先构造它不会有点破坏缓存的意义吗?

代码如下所示:

public sealed class Cache : ICache
{
    private readonly MemoryCache _cache;

    public Cache()
    {
        _cache = MemoryCache.Default;
    }

    public T GetOrAdd<T>(string key, Func<T> create, TimeSpan timeToLive) where T : class
    {
        // This call kinda defeats …
Run Code Online (Sandbox Code Playgroud)

c# collections asp.net-mvc multithreading lru

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

在西班牙的.Net框架版本中,DateTimeFormatInfo :: AbbreviatedDayNames的值是否曾发生过变化?

我有以下代码:

var thursday = new CultureInfo("es-ES").DateTimeFormat.AbbreviatedDayNames[4];
Run Code Online (Sandbox Code Playgroud)

如预期的那样返回"ju.".

我刚刚继承了一些非常古老的代码,它有测试代码,期望值为"jue"...

我在想 - 在.Net框架中有没有改变过?

编辑1 - 扩展:

我正在使用.Net 4.5 ...我有一台最近安装的Visual Studio 2013机器,没有任何异常安装.

        var format = new CultureInfo("es-ES").DateTimeFormat;

        Console.WriteLine("AbbreviatedDayNames:");

        foreach (var name in format.AbbreviatedDayNames)
        {
            Console.WriteLine(name);
        }

        Console.WriteLine("ShortestDayNames:");

        foreach (var name in format.ShortestDayNames)
        {
            Console.WriteLine(name);
        }
Run Code Online (Sandbox Code Playgroud)

输出:

AbbreviatedDayNames:
do.
lu.
ma.
mi.
ju.
vi.
sá.
ShortestDayNames:
D
L
M
X
J
V
S
Run Code Online (Sandbox Code Playgroud)

编辑2 - 我的机器是英国英语,虽然如果我将文化指定为"es-ES",我不明白为什么会这么重要?

编辑3 - 很奇怪:

https://dotnetfiddle.net/ - 返回ju.

http://www.compileonline.com/compile_csharp_online.php - 返回jue

.net c#

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

如何从 hyper-v 虚拟机连接到本地主机服务?

我有一个 WCF 服务在“http://localhost:12345/ServiceName”上运行。我还有一个在 Windows 8 Public Beta 中的 hyper-v 下运行的虚拟机。有什么方法可以从虚拟机连接到此服务吗?我似乎无法在 hyper-v 管理器中设置桥接网络连接。另一种方法是让 WCF 服务绑定到 Win8 计算机名称或 IP,但我不知道如何从 VM 端找出该端点。WCF 服务可以按照任何需要的方式进行更改...

任何帮助将非常感激!

非常感谢,乔恩

wcf hyper-v virtual-machine

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

任何人都可以告诉我为什么这个C#电子邮件验证正则表达式(正则表达式)挂起?

我有一个很好的电子邮件vaidation正则表达式: 电子邮件正则表达式

    public static void Main(string[] args)
    {
        string value = @"cvcvcvcvvcvvcvcvcvcvcvvcvcvcvcvcvvccvcvcvc";
        var regex = new Regex(
            @"^([0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,9})$",
            RegexOptions.Compiled);
        var x = regex.Match(value); // Hangs here !?!
        return;
    }
Run Code Online (Sandbox Code Playgroud)

它适用于大多数情况,但上面的代码挂起,燃烧100%CPU ...我已经在W8 metro应用程序中测试过.以及标准的.Net 4.5应用程序.

任何人都可以告诉我为什么会发生这种情况,如果有一个好的电子邮件验证REGEX没有挂起,或者有没有办法解决这个问题?

非常感谢,乔恩

c# regex

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

第二个字符串更长时奇怪的字符串排序

比较"î"

string.Compare("î", "I ", StringComparison.CurrentCulture) -- returns -1
string.Compare("î", "I ", StringComparison.CurrentCultureIgnoreCase) -- returns -1
string.Compare("î", "I", StringComparison.CurrentCulture) -- returns 1 (unexpected)
string.Compare("î", "I", StringComparison.CurrentCultureIgnoreCase) -- returns 1  (unexpected)
Run Code Online (Sandbox Code Playgroud)

随着"我"

string.Compare("i", "I ", StringComparison.CurrentCulture) -- returns -1
string.Compare("i", "I ", StringComparison.CurrentCultureIgnoreCase) -- returns -1
string.Compare("i", "I", StringComparison.CurrentCulture) -- returns -1
string.Compare("i", "I", StringComparison.CurrentCultureIgnoreCase) -- returns 0
Run Code Online (Sandbox Code Playgroud)

目前的文化是en-GB.我希望所有这些都返回1.为什么更长的字符串会改变排序顺序?

c# sorting string

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

可移植类库和WebBrowserTask与Windows.System.Launcher

我假设答案是否定的,但以防万一......有没有办法在PCL中执行特定于平台的代码?

我的具体例子非常适合PCL.使用profile104(WP7/Windows Store/Net40)完全支持绝大多数代码.唯一特定于平台的是启动深层链接的能力:

my-custom-protocol://some/url
Run Code Online (Sandbox Code Playgroud)

非共享代码是:

On WP7, it would be:
        WebBrowserTask web = new WebBrowserTask();
        web.Uri = BuildUrl();
        web.Show();

On WP8 and Windows Store it would be:
        Windows.System.Launcher.LaunchUriAsync(BuildUrl());

On Net40, I guess you would host a web-browser control.
Run Code Online (Sandbox Code Playgroud)

因此,公共库提供自定义"任务"对象,这些对象提供"BuildUrl()"的实现.问题是,在支持的设备上,您希望启动"my-custom-protocol:// some/url",但在任何其他设备上,您要转到网络后备http://mysite.com/some/网址.这一切都包含在:

        new CustomTask(data).Show()
Run Code Online (Sandbox Code Playgroud)
  • 选项1(当前实现):不要使用PCL,并在CustomTaskBase类中使用#ifdefs来包含平台细节.但是,我真的不希望维护平台特定的项目文件,并将cs文件添加为链接:-(

  • 选项2:将发射器放在特定于平台的组件中,将所有其他代码放在PCL中.同样,我不喜欢这样,因为它看起来很重,并没有减少我们的项目数量.它还意味着客户端需要引用两个程序集,而不是一个程序集,这对于一些自定义任务来说似乎有点过分.

  • 选项3:将抽象的IPlatformSpecificLauncher注入Launcher的构造函数,然后该构造函数成为URLBuilder.这会将启动代码移动到客户端,这将是复制粘贴(尽管很小).然而,它确实使API复杂化并使其可读性降低.

        new CustomTask(new WP8Launcher(), data).Show()
    
    Run Code Online (Sandbox Code Playgroud)
  • 选项4:更改API,以便CustomTask只返回要启动的URL(并再次在客户端中启动启动代码).但是,如何在不支持自定义协议的设备上实现Web回退?你不能说如果(平台== WP7)在PCL,你呢?

提前感谢您的任何提示和技巧!

c# launcher portable-class-library windows-store-apps

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