我正在使用从NuGet安装的Lucene.net 3.0.3和AzureDirectory 2.0.4937.26631(在NuGet中称为Lucene.Net.Store.Azure)。
在azuredirectory.codeplex.com上的项目描述指出:“更具体地说:您可以具有1..N个工作人员角色,将文档添加到索引中,并且1..N个搜索者Webrol几乎实时地搜索目录。” (添加了重点)暗示可能有多个工作角色并行写入索引。但是,当我尝试执行此操作时,我得到许多“锁定超时:AzureLock@write.lock”。例外。
我的代码遵循AzureDirectory文档(azuredirectory.codeplex.com/documentation)中给出的示例。我的代码大致(简化问题)。
var dbEntities = // Load database entities here
var docFactory = // Create class that builds lucene documents from dbEntities
var account = // get the CloudStorageAccount
var directory = new AzureDirectory(account, "<my container name>");
using(var writer = new IndexWriter(directory, new StandardAnalyzer(Version.LUCENE_30), createEvenIfExists, IndexWriter.MaxFieldLength.UNLIMITED))
{
foreach(var entity in entities)
{
writer.AddDocument(docFactory.CreateDocument(entity));
}
}
Run Code Online (Sandbox Code Playgroud)
当按顺序运行时,此代码可以正常工作。但是,如果我在多个线程/工作者上并行运行相同的代码。我收到很多“锁获取超时:AzureLock@write.lock。” 例外情况:
[Lucene.Net.Store.LockObtainFailedException: Lock obtain timed out: AzureLock@write.lock.]
at Lucene.Net.Store.Lock.Obtain(Int64 lockWaitTimeout) in d:\Lucene.Net\FullRepo\trunk\src\core\Store\Lock.cs:line 83
at …
Run Code Online (Sandbox Code Playgroud) 我最近开始使用 ASP.NET 和 DynamoDB 在 C# 中编写大量异步/等待代码。我已经选择并设置Ninject作为我的 IoC 容器。从我在 Ninject 文档和在线搜索中找到的内容来看,Ninject 没有对异步的具体支持。这是有道理的,因为它是在 async/await 添加到 C# 之前编写的。然而,MSDN 上一篇关于异步编程最佳实践的文章推荐了“全程异步”方法。.NET 是否有支持异步解析和注册异步工厂的 IoC 容器?即,如果 Ninject 支持它,则kernel.GetAsync<IMyService>()
返回类似的内容Task<IMyService>
以及注册方法(例如kernel.Bind<IMyService>().ToMethod(ctx => factory.CreateAsync())
该CreateAsync
方法返回 a )Task<MyService>
,
实际上,我的 ASP.NET 异步代码出现了死锁,因为我被迫阻止异步代码(要了解为什么会发生这种情况,请参阅不要阻止异步代码)。我已经解决了这个问题,.ConfigureAwait(false)
但建议同时执行这两种方法以防止出现问题。另外,我被迫ConfigureAwait(false)
在一个无法证明我不需要上下文的地方添加,因为我正在调用一个将来可能会使用上下文的委托。
我有一个异步的用户存储库,因为它访问我的数据存储。
public interface IUserRepository
{
Task<User> GetAsync(Guid id);
}
Run Code Online (Sandbox Code Playgroud)
我将当前用户注册为依赖项,这样我就能够访问姓名、电子邮件等信息并进行安全检查。
kernel.Bind<User>().ToMethod(GetCurrentUser).InRequestScope();
// The implementation of GetCurrentUser
public static User GetCurrentUser(IContext context)
{
var repository = context.Kernel.Get<IUserRepository>();
var currentUserId …
Run Code Online (Sandbox Code Playgroud) 我正在使用brunch.io,效果很好.
我唯一不知道如何实现的是在构建前进行清理.
例如,如果我brunch build
创建源映射.如果我这样brunch build --production
做不会创建源地图.但是,已经存在的源映射不会被删除.
是否有任何选项/插件可以清理?我应该在其他地方使用npm clean吗?
我的问题从表面上看与使用泛型类型作为异步方法的返回类型非常相似。但是,他没有现实世界的使用场景,因此可以说的是您无法做到这一点。我从乔恩·斯凯特(Jon Skeet)对这个问题的回答以及博客文章中了解到,为什么异步方法必须返回Task?为什么不支持它。这篇文章讨论了解决方法,但是没有一个适用于我的用例。
我的问题是,鉴于我正在尝试做的事情,解决语言限制的最佳方法是什么?
在生产代码中,我们有一个retry方法,该方法采用a Func<Task>
并返回Task
。然后,我们还需要能够重试TaskT>
功能。因此,我们将重试方法更改为(略有简化):
public static async T Retry<T>(Func<T> action) where T : Task
{
for (var i = 0; ; i++)
{
try
{
return await action();
}
catch (Exception)
{
if (i >= 3)
throw;
}
}
}
Run Code Online (Sandbox Code Playgroud)
编译器当然会报告错误“异步方法的返回类型必须为空,任务或任务”。我可以做Retry
的工作既Task
和Task<T>
不写入方法的两个副本?
我已经正确设置了带有 S3 源的 Cloudfront 签名 URL,并且正在使用response-content-disposition
查询字符串参数来指定文件下载名称。当内容处置文件名不包含空格时,我使用 .NET AWS SDKAmazonCloudFrontUrlSigner.GetCannedSignedURL
方法生成的签名 URL可以正常工作。但是,如果文件名包含空格,则访问被拒绝。因此,类似于下面的代码将生成一个拒绝访问的 URL。
var contentDisposition = HttpUtility.UrlEncode("attachment;filename=My File.txt");
var key = "example.txt?response-content-disposition="+contentDisposition;
return AmazonCloudFrontUrlSigner.GetCannedSignedURL(
AmazonCloudFrontUrlSigner.Protocol.https,
"myBucket",
cloudFrontPrivateKey,
key, cloudFrontAccessKeyId, expirationDateTime);
Run Code Online (Sandbox Code Playgroud)
它显然似乎与 URL 编码有关。
我已经通读了有关通过 CloudFront 提供私有内容的文档中的所有信息。我读了AmazonCloudFrontUrlSigner
类的代码。我还尝试了多种组合,UrlEncode
例如不编码,仅编码文件名部分,甚至不编码但在生成签名 URL 后用编码版本替换。所有这些要么拒绝访问,要么给出签名与 url 不匹配的错误。
.net ×2
c# ×2
amazon-s3 ×1
async-await ×1
asynchronous ×1
azure ×1
brunch ×1
generics ×1
lucene.net ×1