更新这个问题的目的是得到一个简单的答案Task.Run()和死锁.我非常理解不混合异步和同步的理论推理,我将它们铭记于心.我不是在向别人学习新事物; 我尽力做到这一点.有时候所有人都需要技术答案......
我有一个Dispose()需要调用异步方法的方法.由于95%的代码都是异步的,因此重构不是最佳选择.拥有IAsyncDisposable框架支持的(以及其他功能)将是理想的,但我们还没有.所以在同一时间,我需要找到一种可靠的方法从同步方法调用异步方法而不会发生死锁.
我宁愿不使用,ConfigureAwait(false)因为这使得责任分散在我的整个代码中,以便被调用者以某种方式行事,以防调用者是同步的.我宁愿在同步方法中做一些事情,因为它是一个不正常的bugger.
在阅读了Stephen Cleary关于另一个Task.Run()总是在线程池中调度甚至异步方法的问题的评论后,它让我思考.
在ASP.NET中的.NET 4.5或任何其他同步上下文中,将任务调度到当前线程/同一线程,如果我有一个异步方法:
private async Task MyAsyncMethod()
{
...
}
Run Code Online (Sandbox Code Playgroud)
我想从同步方法中调用它,我可以使用Task.Run()它Wait()来避免死锁,因为它将异步方法排队到线程池吗?
private void MySynchronousMethodLikeDisposeForExample()
{
// MyAsyncMethod will get queued to the thread pool
// so it shouldn't deadlock with the Wait() ??
Task.Run((Func<Task>)MyAsyncMethod).Wait();
}
Run Code Online (Sandbox Code Playgroud) 我有两个异步方法Task<int> DoInt()和Task<string> DoString(int value).我有一个第三个异步方法,Task<string> DoBoth(int value)其目标是异步执行DoInt(),将其输出管道输出DoString(int)并产生结果DoBoth().
重要的限制是:
DoInt()或DoString(),所以我无法修改它们.DoBoth()关键是我已经有异步的方法(即返回任务),我想将数据从任务管道传输到任务,而不会阻塞,在最初的任务中返回最终结果.我可以执行以下所有操作,但不会阻塞以下代码:
代码示例:
// Two asynchronous methods from another library, i.e. can't be changed
Task<int> DoInt();
Task<string> DoString(int value);
Task<string> DoBoth()
{
return DoInt().ContinueWith<string>(intTask =>
{
// Don't want to block here on DoString().Result
return DoString(intTask.Result).Result;
});
}
Run Code Online (Sandbox Code Playgroud)
既然Task<string> DoString(int)已经是一个异步方法,我该如何干净地创建一个非阻塞的延续呢?实际上,我想从现有的Task创建一个延续,而不是从Func创建.
我正在尝试使用ASP.NET MVC 4 Web API在HTTP上编写真正的RESTful Web服务.
我目前面临的挑战是根据我的状态代码返回不同的返回类型(entity-body).
例如,对于资源Hammer,我有一个.NET模型类"Hammer"和一个HammerController:
namespace Awesomeness
{
public class HammerController : ApiController
{
public Hammer Get(int id)
{
}
...
Run Code Online (Sandbox Code Playgroud)
如果ID不存在(404)或需要不同的授权(401),我可以轻松地快速返回并手动设置状态代码和任何其他内容,这很酷.但是,在许多非2xx状态中,我想返回一个与Hammer资源表示不同的实体.我可以轻松地手动执行此操作,但我希望根据请求标头利用ASP.NET MVC 4 Web API自动序列化和反序列化到XML或JSON.
所以我的核心问题是:我可以利用ASP.NET MVC 4 Web API的自动序列化同时返回不同的返回类型吗?
我想到的一些潜在方法是:
有控制器方法返回主资源类型,但短路返回HttpContext.Current.Response并以某种方式挂钩到自动序列化(首选).
让我的Model类更像是一个C union,它表示这种类型或那种类型,并让它作为正常返回过程的一部分进行序列化(并且只需覆盖状态代码和所需的任何响应头).即使我想通过如何做到这一点,我仍然觉得它最终会变得非常黑客.
编辑2012年4月27日: 我可以像这样抛出一个HttpResponseException:
HttpResponseMessage response = new HttpResponseMessage(statusCode);
if (!string.IsNullOrWhiteSpace(text))
{
response.Content = new StringContent(text);
}
throw new HttpResponseException(response);
Run Code Online (Sandbox Code Playgroud)
...但现在我需要弄清楚如何挂钩到自动魔术序列化并设置response.Content为Accept标头协商表示.
我目前使用的主存储库有3个标准遥控器:本地备份,我的开发合作伙伴工作站和托管存储库.我们有3个或4个分支,大部分时间都处于活动状态,一个是主分支.
我使用以下方法定期监控分支机构:
git log --graph --oneline --decorate -15 my-branch his-repo/his-branch master other-branch
Run Code Online (Sandbox Code Playgroud)
--decorate是至关重要的,因为它让我了解与我们非常不稳定的发展分支有关的事情.问题是我在装饰中看到了所有远程引用和所有分支,标签等.
有没有办法限制--decorate只输出某些参考?在命令行列出refs仅限制显示的提交,而不是显示的refs.
谢谢,迈克
我试图201 Created使用ASP.NET 4 Web API为RESTful POST操作返回HTTP状态代码,但我总是得到一个200 OK.
我目前正在调试IIS 7.5.7600.16385,VS 2010 Professional,Windows 7 64位专业版.
public MyResource Post(MyResource myResource)
{
MyResource createdResource;
...
HttpResponse response = HttpContext.Current.Response;
response.ClearHeaders(); // added this later, no luck
response.ClearContent(); // added this later, no luck
response.StatusCode = (int)HttpStatusCode.Created;
SetCrossOriginHeaders(response);
return createdResource;
}
Run Code Online (Sandbox Code Playgroud)
我已经看到HttpContext.Current.Response.StatusCode在返回数据之前设置的其他示例,所以我认为这不是问题.我还没有在MVC 4源代码中找到它.
(这与我对这个问题的调查有关,但有足够的主题来保证自己的问题)
我不确定问题是IIS还是Web API.我会做进一步的测试来缩小范围.
我正在使用ASP.NET MVC 4 Web API创建RESTful Web服务.对于API访问,我返回JSON,但是一旦我使一切正常工作,内容协商默认情况下应该适用于XML和JSON.
由于我正在努力建立一个真正的RESTful以资源为中心的Web服务,我的URI将指向实际的资源.我想通过返回Accepts: text/html请求中的资源的HTML表示来利用它(比如在浏览器中抛出链接).
我希望能够利用MVC 4 Web API的内容协商来为使用Razor模板的text/html插入渲染器.这样做有什么工作的例子吗?
是的,这是桥接"常规"MVC页面和Web API.基本上我想创建一个渲染器,它使用基于约定的方法来查找和渲染Razor视图,就像"常规"MVC一样.我可以提出基于约定的视图查找逻辑. 我只是在寻找 a)全局地将我的text/html渲染器插入到内容协商中,以及b)手动使用Razor引擎将我的模型渲染为HTML.
在EF 6中,我想异步处理从数据库引擎返回的实体.
我知道我可以打电话ToListAsync(),ForEachAsync()也许他们会做我正在寻找的事情,但我不相信.我认为我要找的是两者的结合.
根据我的理解,ToListAsync()将在从数据库引擎读取整个查询并转换为实体时完成任务.这意味着您必须等待整个查询在开始处理之前返回.
我无法确定ForEachAsync()我正在寻找的是什么,但我假设,由于没有在其他地方找到信息,它ForEachAsync()只是在已经检索的集合上工作,并且每个项目的处理都是异步的.
理想的是,ForEachAsync()当从数据库引擎中检索数据时,(或另一种未知的方法)会调用该任务.
所以... ForEachAsync()实际上是这样做的,如果没有,有没有办法完成它?
想要这个的原因有两个:
更新:基本上,如果在你打电话时为每个实体DbContext举起一个事件,我可以完成我想要的一切.因为我可以将实体排入单独的任务处理器,并且可以有效地处理实体并利用任何I/O延迟.我总是可以调整单独的任务处理器,所以我真的不需要EF来支持实体的异步处理,只是在每个实体加载时异步加载和触发事件/调用委托.OnEntityLoadedLoadAsync()
更新2:如果ForEachAsync()在实体被加载时被调用,那么这也将完成我所追求的目标.
c# asynchronous entity-framework async-await entity-framework-6
我遇到的一个特定问题是VS2015允许您使用较新的C#语法,例如,public string MyProperty => _myProperty;当针对.NET 4.0框架项目时,然后其他人在VS2013中打开项目会出现编译器错误.
有没有办法配置VS2015,以便它警告C#6特有的功能或错误?或者说另一种方式,我可以告诉VS2015哪个版本的C#我想编译?
使用libgit2sharp-SSH使用SshUserKeyCredentials进行身份验证时遇到一些问题:
var co = new CloneOptions();
co.CredentialsProvider = (_url, _user, _cred) => new SshUserKeyCredentials { PrivateKey="C:\\path\\to\\private_key" };
Repository.Clone("git@... .repository.git", path, co);
Run Code Online (Sandbox Code Playgroud)
我发现SshUserKeyCredentials对象浏览源代码,所以我的第一个问题是,是否可以使用此对象从gitlab部署基于密钥的签出?
该对象似乎需要PrivateKey,Username,PublicKey和Passphrase的任意组合.我目前正在使用PrivateKey.
我最终得到的错误:
{"Failed to start SSH session: Unable to exchange encryption keys"}
Run Code Online (Sandbox Code Playgroud)
如果这种方式不起作用,是否有另一种方法可以使用部署密钥以编程方式管理来自C#环境的git?
在进行 Twilio 调用并指定回调 URL ( https://www.twilio.com/docs/api/rest/making-calls#url-parameter ) 时,POST 时我的回调 URL 似乎被截断为 148 个字符回到服务器发生。我可以将完整的 URL 放在 POSTMAN 中并模拟请求,它工作正常。
我在 Twilio API 文档中找不到长度限制,需要知道这是否是实际限制。完整的 URL(一个例子是 195 个字符长)显示在 twilio.com 上的呼叫日志中,但我的服务器只获取 148 个字符(包括协议、主机、端口),因此请求失败。
我正在为我们的系统编写一个 Twilio 代理,以便在中继回调之前集中处理所有常见处理。我需要 URL 上的额外长度来传递 base64 编码的端点(翻译非 URL 友好字符)。我正在考虑使用不同的算法来缩短 URL,但我真的想保持这种优化和简单。
Twilio 回调 URL(用于呼叫、状态等)是否有 148 个字符的限制?
更新:我的代码拒绝传入的 Twilio 请求,因为 Twilio 签名验证失败(请参阅https://github.com/twilio/twilio-csharp/issues/44),并且由于失败,我向 Twilio 返回了 400 Bad Request验证。那时 Twilio 正在发送未截断的URL。似乎 Twilio 在收到 400 后重试了相同的请求,将 URL 限制为 148 个字符。该请求在我的本地测试中没有失败,因为 Twilio 签名验证始终对本地请求成功。
c# ×5
asynchronous ×3
.net ×2
async-await ×2
git ×1
git-log ×1
libgit2sharp ×1
libssh2 ×1
razor ×1
twilio ×1