在下面的代码中,由于接口,类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) 观察:
在我们的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) 我对.Net Core很新,但已经建立了一个有效的Asp.Net核心WebAPI站点 - 现在我想与另一个项目共享一些代码......
我想创建一个可以被其他两个库使用的共享库(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客户端.
有没有办法制作一个包含针对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月份.
有任何想法吗?
非常感谢,乔恩
资料来源:
这可能就像在棍子上求月亮一样;但是是否有“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)
Microsoft 的最佳解决方案似乎是“System.Runtime.Caching.MemoryCache”,但它似乎有几个警告:
代码如下所示:
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) 我有以下代码:
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
我有一个 WCF 服务在“http://localhost:12345/ServiceName”上运行。我还有一个在 Windows 8 Public Beta 中的 hyper-v 下运行的虚拟机。有什么方法可以从虚拟机连接到此服务吗?我似乎无法在 hyper-v 管理器中设置桥接网络连接。另一种方法是让 WCF 服务绑定到 Win8 计算机名称或 IP,但我不知道如何从 VM 端找出该端点。WCF 服务可以按照任何需要的方式进行更改...
任何帮助将非常感激!
非常感谢,乔恩
我有一个很好的电子邮件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没有挂起,或者有没有办法解决这个问题?
非常感谢,乔恩
比较"î"
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.为什么更长的字符串会改变排序顺序?
我假设答案是否定的,但以防万一......有没有办法在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# ×6
.net ×3
nuget ×2
.net-core ×1
asp.net-mvc ×1
async-await ×1
collections ×1
hyper-v ×1
launcher ×1
lru ×1
msbuild ×1
regex ×1
sorting ×1
string ×1
stylecop ×1
threadpool ×1
wcf ×1
x86 ×1