我不确定我应该如何混合plinq和async-await.假设我有以下界面
public interface IDoSomething (
Task Do();
}
Run Code Online (Sandbox Code Playgroud)
我有一个列表,我想并行执行,并能够await完成所有这些.
public async Task DoAll(IDoSomething[] doers) {
//Execute all doers in parallel ideally using plinq and
//continue when all are complete
}
Run Code Online (Sandbox Code Playgroud)
怎么实现这个?我不知道如何从并行linq转到任务,反之亦然.
我对异常处理并不十分担心.理想情况下,第一个会触发并打破整个过程,因为我打算在出错时抛弃整个过程.
编辑:很多人都说Task.WaitAll.我知道这一点,但我的理解(除非有人能证明不是这样)是因为它不能主动将你的东西并行化到多个可用的处理器核心.我特别要问的是双重的 -
如果我await一个Task一个PLINQ行动中确实是摆脱由于日程安排一个新的线程有很多的优势的?
如果我doers.AsParallel().ForAll(async d => await d.Do())平均需要大约5秒钟,那么在此期间我怎么不旋转调用线程呢?
c# linq parallel-extensions task-parallel-library async-await
考虑这段代码
div {
box-sizing: border-box;
width: 0;
height: 0;
max-width: 0;
max-height: 0;
border: 1px solid gray;
padding: 12px;
overflow: hidden;
}Run Code Online (Sandbox Code Playgroud)
<div>Hi</div>Run Code Online (Sandbox Code Playgroud)
据我所见过的一切阅读,理解和使用的有关box-sizing: border-box;这应该显示什么,因为宽度和高度都是零和填充/边境零宽度和高度的内部.
然而,我们看到的是一个26x26的盒子((12个填充+ 1个边框)*2).是什么赋予了?为什么border-box不在这里工作?
我正在尝试组合一些组件的测试.我有以下内容
describe(`selecting an item`, () => {
let element, $scope;
beforeEach(module('my-app'))
beforeEach(inject(($compile, $rootScope) => {
$scope = $rootScope;
element = $compile(`
<item-selector parent-id="pid">
</item-selector>
`)($scope)
//call $ctrl.activate() on the component's controller
}))
})
Run Code Online (Sandbox Code Playgroud)
控制器item-selector有一个activate()方法.我如何从测试中调用它?$scope似乎没有任何参考.
随着我在解决方案中获得越来越多的命名空间,我文件顶部的using语句列表变得越来越长.在我的单元测试中尤其如此,对于可能被调用的每个组件,我需要包括接口的使用,IoC容器和具体类型.
在我的集成测试文件中有超过17行的使用,它只是变得非常混乱.有谁知道是否有一种方法来为我的基地使用语句定义一个宏?还有其他方法吗?
很长一段时间以来,我不得不做任何事情,除了对ASP.NET的一些小修复,我从未部署过ASP.NET 2.0/3.5应用程序,所以可能我只是缺少一些简单但我绝对需要帮助的东西.
基本上,我们有一个写得不好的.NET 1.1 Web应用程序,我们有一些承包商进入并打破了我们的一些第三方依赖项并将其更新为编写得不好的.NET 3.5 Web应用程序(编写得很糟糕的部分将在稍后解决) .
所以现在我正在像我们的部署环境那样在虚拟机上练习部署方案.
但导航到我得到的登录页面:
Parser Error Message: The file '/View/LoginPage.aspx.cs' does not exist.
Line 1: <%@ Page Language="C#" MasterPageFile="~/MasterPage/LoginMasperPage.Master" AutoEventWireup="true"
Line 2: CodeFile="LoginPage.aspx.cs" Inherits="MyApp.View.LoginPage" Title="MyApp - Login Page" %>
Run Code Online (Sandbox Code Playgroud)
是什么赋予了?在应用程序的.NET 1.1版本中,所有c#代码都被编译到MyApp.dll中,应用程序知道在那里查看.使用反射器进行双重检查,所有代码也在这里的二进制文件中,只是服务器没有查找它.
怎么回事?我可以等待承包商明天进入,或者将包括aspx文件在内的所有内容编译成二进制文件,但我们有充分的理由保持aspx文件不编译,如果可能的话我今天想部署.
请注意,这不是ASP.NET MVC,视图命名空间/目录就是保存所有webform的地方
我有几行方法,我想确保在执行这些方法时没有上下文切换到另一个线程?是的,重新架构是一种选择,但如果我能做到这一点,那将是更加便利的.
这可能吗?如果没有,那么有人知道决定背后的原因吗?
编辑:我问的原因是我有一个负责返回值的类,该值是通过事件提供的,因此当调用GetValue()时,线程需要阻塞直到引发事件.所以我们有:
public class ValueResolver {
IPersistentNotifier _notifier;
IValueMonitor _monitor;
Value _value;
ManualResetEvent _resolvedEvent = new ManualResetEvent(false);
public ValueResolver(IPersistentNotifier notifier, IValueMonitor monitor) {
_notifier = notifier;
_monitor = monitor;
_monitor.ValueAcquired += ValueAcquired;
}
public Value GetValue() {
_value = null;
persistentNotifier.Show("Getting Value")
_monitor.Start();
_resolvedEvent.WaitOne(60000, false);
return _value
}
public void ValueAcquired(Value val) {
_value = val;
_monitor.Stop();
_notifier.Hide();
_resolvedEvent.Set();
}
}
Run Code Online (Sandbox Code Playgroud)
只有我能想到为此编写测试的方式就像(在犀牛嘲笑中)
var monitor = MockRepository.GetMock<IValueMonitor>()
monitor.Expect(x=>x.Start()).Do(new Action(() => {
Thread.Sleep(100);
monitor.Raise(y=>y.ValueAcquired, GetTestValue());
});
Run Code Online (Sandbox Code Playgroud)
但欢迎任何建议.
在我的WinForms应用程序中,我需要弹出一个小的自定义对话框,在屏幕上停留X秒,然后消失.因此,一旦经过了适当的时间,我就使用System.Threading.Timer来调用_dialog.Close()方法.这当然意味着我必须完成整个"if InvokeRequired BeginInvoke"舞蹈,这不是一个真正的问题.
然而,问题是我的主要线程可能是关闭做上帝知道什么时候调用BeginInvoke.它可能无法绕过关闭窗口很长一段时间.我不需要窗口以毫秒的速度关闭,但是在一秒左右的时间内确实是必要的.
所以我的问题是BeginInvoke如何实际进入主线程,我怎样才能解决这个奇怪的限制呢?
我的html看起来大致如此
<div>
<div id="header"></div>
<div id="chart"></div>
<div id="legend"></div>
<div id="info1"></div>
<div id="info2"></div>
<div id="info3"></div>
</div>
Run Code Online (Sandbox Code Playgroud)
我想定位这样的元素:

我是怎么做到这一点的?
编辑:这是一个关于"正确的方法"的问题,它肯定不容易谷歌.基本上我想要做的,而不是在html中定义列,是为容器div定义高度,然后让其他div自然地在其中定位.
我刚刚将CodeMirror升级到最新版本,现在有以下代码:
// clear previous errors from editor window
for (var i = 0; i < layoutCodeEditor.lineCount(); i++) {
layoutCodeEditor.clearMarker(i);
layoutCodeEditor.setLineClass(i, null, null);
}
var valid = JSLINT(code);
var jsLintError = "";
if (!valid) {
jsLintError = JSLINT.error_report(JSLINT.data());
_.chain(JSLINT.errors).compact().each(function(e){
// show markers in the code edit window against lines with Jslint errors
layoutCodeEditor.setMarker((+e.line) - 1, "?", "errors");
layoutCodeEditor.setLineClass(+(e.line) - 1, null, "errorLine");
})
}
Run Code Online (Sandbox Code Playgroud)
似乎已删除了setMarker/clearMarker和setLineClass函数.现在他们的等价物是什么?
我只是启用了源地图,因为,为什么不,我想尝试一下.但是,我发现IISExpress不会下载.coffee文件,所以它不起作用.
我确定这是一个简单的web.config修改,我只是不确定是哪一个.如何配置它来提供这些服务?
我不确定我是否理解这方面的内容display: block.
如果我有两个后续块元素,其设置宽度为元素留出足够的空间,使它们可以并排,看起来它们应该是并排的.但事情并非如此.
body {
padding: 0;
margin: 0;
}
div {
height: 100px;
box-sizing: border-box;
padding: 0;
margin: 0;
border: 0;
display: block;
}
.left {
background-color: blue;
}
.right {
background-color: red;
}
.half {
width: 30%;
}Run Code Online (Sandbox Code Playgroud)
<div class="half left"></div><div class="half right"></div>Run Code Online (Sandbox Code Playgroud)
根据我的理解,css布局模块中没有概念作为"线",因此没有任何东西(正如w3schools所说的那样)"所有块都在新线上开始".
那么描述这种行为的规范究竟是什么呢?
注意:我知道有很多方法可以并排放置,从inline-block,到float,到flexbox,我正在寻找一个专门描述规范行为的答案.
我尝试了这段代码
struct Bar {
public int Value;
}
async Task doItLater(Action fn) {
await Task.Delay(100);
fn();
}
void Main() {
Bar bar = new Bar { Value = 1 }; //Bar is a struct
doItLater(() => {
Console.WriteLine(bar.Value);
}).Wait();
}
Run Code Online (Sandbox Code Playgroud)
得到了输出1.现在这让我很困惑.我的逻辑如下
Task.Delay(100)命中时,该执行线程完成,并且请求TPL fn()稍后执行.bar 存储在堆栈上,当我们在闭包中访问它时,该帧不应该存在.那么我怎么得到一个输出1?
c# ×4
css ×3
.net ×2
asp.net ×2
.net-3.5 ×1
angularjs ×1
async-await ×1
border-box ×1
closures ×1
codemirror ×1
css3 ×1
deployment ×1
iis-express ×1
javascript ×1
linq ×1
namespaces ×1
struct ×1
timer ×1
unit-testing ×1
winforms ×1