一般的答案,如这里和这里 来发射后不管的问题是不使用异步/ AWAIT,但使用Task.Run或TaskFactory.StartNew在同步方式传递来代替.
但是,有时我想要发射并忘记的方法是异步的,并且没有等效的同步方法.
更新注释/警告:正如Stephen Cleary在下面指出的那样,在您发送响应后继续处理请求是危险的.原因是AppDomain可能会在该工作仍在进行时关闭.有关详细信息,请参阅其响应中的链接.无论如何,我只是想提前指出,所以我不会让任何人走错路.
我认为我的情况是有效的,因为实际工作是由不同的系统(不同服务器上的不同计算机)完成的,所以我只需要知道该消息已经留给该系统.如果存在异常,则服务器或用户无法对其进行任何操作并且不会影响用户,我需要做的就是参考异常日志并手动清理(或实现一些自动机制).如果关闭AppDomain,我将在远程系统中有一个残留文件,但是我将在常规维护周期中选择它,因为我的Web服务器(数据库)不再知道它的存在,并且它的名称是唯一的时间戳,它仍然会徘徊不会导致任何问题.
如果我能像Stephen Cleary所指出的那样访问持久性机制,那将是理想的,但不幸的是我现在还没有.
我认为只是假装DeleteFoo请求在客户端(javascript)已经完成,同时保持请求打开,但我需要响应中的信息继续,所以它会保持原状.
那么,原来的问题......
例如:
//External library
public async Task DeleteFooAsync();
Run Code Online (Sandbox Code Playgroud)
在我的asp.net mvc代码中,我想以一种即发即忘的方式调用DeleteFooAsync - 我不想阻止等待DeleteFooAsync完成的响应.如果DeleteFooAsync由于某种原因失败(或抛出异常),则用户或程序无法对其进行任何操作,因此我只想记录错误.
现在,我知道任何异常都会导致未观察到的异常,所以我能想到的最简单的情况是:
//In my code
Task deleteTask = DeleteFooAsync()
//In my App_Start
TaskScheduler.UnobservedTaskException += ( sender, e ) =>
{
m_log.Debug( "Unobserved exception! This exception would have been unobserved: {0}", e.Exception );
e.SetObserved();
};
Run Code Online (Sandbox Code Playgroud)
这样做有风险吗?
我能想到的另一个选择是制作我自己的包装器,例如:
private void async DeleteFooWrapperAsync()
{
try
{
await DeleteFooAsync();
}
catch(Exception …Run Code Online (Sandbox Code Playgroud) 我想阻止我的一些页面显示在搜索结果中.我的理解是我<head>在页面的部分添加了以下内容:
<meta name="robots" content="noindex,nofollow"/>
Run Code Online (Sandbox Code Playgroud)
问题是我的页面使用了一个常见的布局页面.就像是:
@{
Layout = "~/Views/Shared/_VanillaLayout.cshtml";
}
Run Code Online (Sandbox Code Playgroud)
布局页面内部是头部,包含大量链接,脚本和元标记.我不想为可索引和不可索引的页面复制它.
根据我的研究,我发现: -
<head>部分很糟糕.希望我错过了一些东西并且有一种很好的(非坏的)方法可以做到这一点,或者我上面提到的其中一种方法毕竟不是那么糟糕.
在C#应用程序中,我想要的是:
未附加调试器时: -
附加调试器时: -
为了举例说明,下面是它如何使用条件catch(我知道在C#中不支持):
注意:虽然我正在显示我的代码抛出异常的示例,但它可能会被第三方库抛出.
static void DoSomething()
{
//This is where I would like the debugger to break execution and show the exception
throw new Exception( "Something went wrong!" );
}
static public void DoSomeStep()
{
try
{
DoSomething();
}
catch( Exception exception when System.Diagnostics.Debugger.IsAttached == false ) //If the debugger is attached don't catch
{
Console.WriteLine( exception.Message ); //Do some processing on the exception
}
}
static …Run Code Online (Sandbox Code Playgroud) 是否可以从命令行运行不属于某个类别的所有测试?从文档中,我知道我可以运行所有类别成员的测试,例如:
vstest.console.exe myTestProject.dll/TestCaseFilter:TestCategory ="Nightly"
我想要做的是为测试类别分配一些测试方法,然后在一次运行中运行这些测试.然后我想在一个单独的测试运行中运行剩余的测试(这是我当前的问题所在).我有超过1000个测试,所以我希望我不必进行搜索并替换所有TestMethod属性以添加"基本"类别.我也不想将测试分成不同的项目.
谢谢.
这与此不同,因为在这种情况下警告是有效的.在这种情况下,根据接受的答案,警告无效.当我在寻找答案时,我看到了这个问题,它没有回答这个问题.
给出以下代码:
internal List<PaletteClass> GetPaletteList( int userId )
{
using(var stashEntities = new StashEntities<StashClass>())
using(var paletteEntities = new PaletteEntities<PaletteClass>())
{
var paletteList = from palette in paletteEntities.Palettes
from stash in stashEntities.Stashes
where palette.UserId == userId && stash.StashId == palette.StashId
select palette;
return paletteList.ToList();
}
}
Run Code Online (Sandbox Code Playgroud)
在StashEntities和PaletteEntities从DBContext继承的地方,我得到了关于stashEntities的"访问置位闭包"的警告,如下图所示.

我知道这是为了防止在参数超出范围后评估表达式的情况.但是,在这种情况下,表达式被分配给使用中的列表,因此stashEntities应该在范围内.
请注意,如果我按如下方式交换表达式:
var paletteList = from stash in stashEntities.Stashes
from palette in paletteEntities.Palettes
where palette.UserId == userId && stash.StashId == palette.StashId
select palette;
return paletteList.ToList();
Run Code Online (Sandbox Code Playgroud)
然后ReSharper将警告移动到paletteEntities.
问题:在这种情况下,此ReSharper警告是否需要担心,或者我是否应该添加ReSharper注释以忽略此行?
奖励问题(如果对上一个问题的回答被忽略):如果我刚刚返回paletteList而没有调用ToList()并强制表达式被评估,该怎么办?ReSharper不担心paletteEntities(在原始示例中)这一事实使我认为有一些事情要保持在范围内,这同样适用于stashEntities并且一切都会好吗?
更新/简化
如下图所示,即使只使用了一个DBContext(stashPaletteEntities),我也会得到相同的消息,这意味着接受的答案是正确的 …
如果你想切入追逐,问题是:在asp.net mvc 5中使用DotNetOpenAuth与Google的最佳/官方方式是什么?
大约一年前,我使用了OAuth(DotNetOpenAuth oAuth和OpenID),因为它开箱即用于asp.net MVC 4(就像在示例项目中一样).从那时起,我成功地将它用于谷歌,脸谱,雅虎和微软.但是,最近我一直在用户登录谷歌时出现间歇性问题.我已经尝试升级到MVC 5和DotNetOpenAuth 4.3,但我得到了同样的结果.
当我查看谷歌文档时,我发现了这个:
重要提示:Google已弃用其对OAuth 1.0的支持.如果您使用的是OpenID 2.0 + OAuth 1.0,我们建议您切换到Google+登录.Google+登录为OAuth 2.0身份验证机制提供了丰富的社交功能,并可访问其他Google桌面和移动功能.它支持所有Google用户和透明迁移.有关详细信息,请参阅迁移Google身份验证.
我完全错了,因为我认为开箱即用的asp.net mvc 4 DotNetOpenAuth使用OpenID 2.0(我使用minimumRequiredOpenIdVersion ="V20")+ OAuth 1.0.我可以在DotNetOpenAuth源中看到'product'下有一个OAuth 2.0库,但我不知道如何使用它.另外,我对Auth 2.0有点紧张,因为我读过的内容并不是非常互补,而且似乎更容易在脚下拍摄(可能没有根据,但它似乎是一个反复出现的主题).
对于Google+,我发现这些说明看起来非常简单,但差不多一年前,所以我想知道这是否仍然是最佳方式.我还发现这个git存储库实现了Google oauth2.不过,我想知道这是否仍然具有相关性,因为它是从前一段时间开始的.
所以,问题是 - 在asp.net mvc5中使用DotNetOpenAuth与Google的最佳/官方方式是什么?希望我没有错过任何明显的东西,在这种情况下只需指向某些链接即可.
更新 我发现这个问题和这个相关的问题.我想我会用git google auth2除非我被告知否则.
解析度
我做了以下事情: -
重要的是在登录后继续使用SSL而不是回退到HTTP,您的登录cookie就像您的用户名和密码一样秘密...在您登录后重定向回HTTP不会使当前请求或将来的请求更快.
在Nuget上获得最新的DotNetOpenAuth.GoogleOAuth2.
我查看了这个msdn博客(由同一作者)关于如何最好地保护网站的建议.基本上,建议添加以下强制所有页面为HTTPS的内容:
filters.Add( new System.Web.Mvc.RequireHttpsAttribute() );
最终这意味着整个网站都是HTTPS.自从进行这些更改后,该网站运行良好.
我想在Opera上运行我的Selenium WebDriver测试,但是当我在Selenium HQ和GitHub页面上查看Opera驱动程序时,它说:
Opera Driver需要Opera 12.x及更早版本
请注意,OperaDriver仅在12.16之前与基于Presto的Operas兼容.不支持基于闪烁的歌剧(15及以上).
Opera现在达到了22.0版本,远远超出了12的最大支持版本.所以,我的问题是: -
我想要做的很简单:
不知何故,在Blob,objectURL,indexedDB和缓存之间它都变得过于复杂并且表现出一些奇怪的行为.如果有一种方法可以将ArrayBuffer直接粘贴到图像中而不是首先转换为Blob然后转换为ObjectURL,那么我可能会使用它,因为它更简单并且摆脱了有问题的Blob和一些不必要的步骤.
如果您想查看流程的代码示例,请查看此jsfiddle.请注意,如下所述,jsfiddle示例中不会出现问题(由于某些原因我无法弄清楚).
我有一个原因是我使用的是IndexedDB,而不是依赖于浏览器缓存,所以让我们尽量避免这种讨论,并且与IndexedDB似乎在Chrome上行为不端的事实无关.
我感兴趣的是,如果有其他人遇到类似的问题或任何建议,如何改善这种情况.
Chrome版本38.0.2125.104 m.
基本上,流程是通过索引检查blob是否在IndexedDB中(请参阅jsfiddle以供参考):
xhr.open)检索blob ,将blob放入IndexedDB(objectStore.put)并显示blob(imgSrc = createTheObjectUrl(blob)).objectStore.get)中检索blob ,从blob创建URL,将image src设置为URL.问题是它最初是有效的,但过了一会儿(有时当我刷新页面时,有时当我关闭Chrome并返回到网页时)我在访问blob的URL时得到404(未找到).
有几点需要注意: -
鉴于jsfiddle似乎总是有效,我能想到的是我的服务器配置方式有所不同.我看一下返回的标题的区别,我可以看到在jsfiddle的情况下,启用了缓存.所以,我开始认为这与缓存有关(这可能是一个完全错误的假设).好像Chrome正在跟踪blob的使用情况并将其从文件系统中删除,因为它会超出范围,从而导致IndexedDB中没有文件的条目(这本身就像一个bug).我不想在服务器上启用缓存,也不希望blob的生命周期依赖于服务器缓存设置.
作为一种解决方法,我做了以下几点: -
这并不理想,因为这意味着我在第一次显示图像时(在它存储在IndexedDB中之前)从blob读取arraybuffer的额外开销,然后我从IndexedDB检索时将ArrayBuffer读入blob的开销很大.也许有一些聪明的共享资源正在进行,这意味着它们使用相同的底层缓冲区,但这意味着依赖于性能的实现.
还有更多 - 如果我从Blob创建一个由Blob创建的Blob,或者从Blob创建一个ArrayBuffer,那么来自ArrayBuffer的新Blob仍然不起作用.就好像使用某种共享引用计数资源一样.那就是 - 我能想到的任何解决方法都涉及在IndexedDB中存储blob不起作用.
使用asp.net-mvc4 oauth Facebook客户端(OAuthWebSecurity.RegisterFacebookClient)就像它在MVC4模板的互联网应用程序中一样.问题是,当用户使用他们的帐户登录时,他们会看到以下消息:
"想要访问您的公开个人资料,朋友列表和电子邮件地址"
问题是,我不想访问他们的公开个人资料,朋友列表和电子邮件地址.我只是想让他们使用他们的Facebook帐户登录我的应用程序.我可以看到这条消息会让人们失望(我个人不会点击'好').
理想情况下,我想指定我的MVC应用程序中所需的权限级别,其中最小级别不会导致该消息.如果需要,这将允许在稍后阶段增加特权.但是,我会以任何方式满足于我可以得到一个不那么不祥的信息.
我查看了Facebook应用管理页面中的设置,但看不到任何可以减少限制的内容.我尝试将权限配置为only-me,但这没有帮助.我在网上搜索并没有找到任何建议解决方案.
任何帮助都会很棒.
编辑:
此外,我不确定为什么在消息中提到"公开个人资料".任何人都无法访问您的公开个人资料(因为它是公开的)?那么为什么要在邮件中提及呢?或者"访问"这个词不仅仅意味着能够看到公众简介吗?
问题
我可以成功完成以下步骤,但UI可能无法响应2 MB或更多的文件.这些文件的大小范围可以是用户从相机或桌面上传的内容,因此我需要处理它们.
用户使用标准文件输入HTML元素上传文件:
<input class="cancel" type="file" name="userFile" id="userFile" accept="image/*"/>
在客户端,我调整文件的大小,使宽度为500px或更小(特别是减少大文件的图像大小)并显示图像.
在客户端,我上传调整大小的较小文件.
演示
看到这个小提琴.
在那里你可以看到-上传较大文件时停止移动.Chrome中的延迟似乎比Firefox更重要,但在Firefox上仍然显而易见.
阻塞的原因
在img src上设置文件数据URL时.这是必需的,以便可以在画布中调整图像大小.
img.src = e.target.result;//blocking here
当img被写入画布时.这是调整图像大小所必需的.
ctx.drawImage( img, 0, 0, width, height );//blocking here
我考虑过的选项
在Web Worker中执行阻止操作.这是不可能的,因为Web Workers无法操作DOM元素,并且在操作DOM时都会发生阻塞调用.
调整Web Worker中的原始图像数据的大小.不幸的是,我不知道img的格式是什么,所以调整大小需要处理所有图像类型.我不知道任何JavaScript库会这样做,我不特别想编写自己的跨格式图像压缩库.
直接调整img的大小,但这不会更改需要上载的基础数据大小.
在服务器上调整大小不是一个选项,因为我想减少上传大小.在客户端上调整大小也更好,因为大图像的内存会提前释放,并且会立即显示调整大小的图像.
其他想法
我知道设置img src是异步的,所以我猜这是复制导致阻塞的数据.我想知道是否有办法共享相同的数据而不是复制?
我正在使用我认为是FileReader用于获取数据URL 的标准方法,然后将数据URL设置为a img.src并canvas.drawImage调整大小(有很多这样的示例,其中一个在这里).任何有助于提高这种方法或其他方法的响应能力的帮助都将受到赞赏.
c# ×3
javascript ×2
.net ×1
asp.net ×1
asp.net-mvc ×1
async-await ×1
asynchronous ×1
debugging ×1
facebook ×1
html ×1
html5 ×1
html5-canvas ×1
indexeddb ×1
oauth ×1
opera ×1
operadriver ×1
razor ×1
selenium ×1
testing ×1
vb.net ×1
vstesthost ×1