我有一个生成BackgroundWorker的表单,它应该更新表单自己的文本框(在主线程上),因此Invoke((Action) (...));调用.
如果HandleClosingEvent我只是做bgWorker.CancelAsync()然后我得到ObjectDisposedException的Invoke(...)电话,可以理解.但是,如果我坐在那里HandleClosingEvent等待bgWorker完成,那么.Invoke(...)永远不会返回,也是可以理解的.
任何想法如何关闭此应用程序而不会出现异常或死锁?
以下是简单Form1类的3个相关方法:
public Form1() {
InitializeComponent();
Closing += HandleClosingEvent;
this.bgWorker.RunWorkerAsync();
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) {
while (!this.bgWorker.CancellationPending) {
Invoke((Action) (() => { this.textBox1.Text = Environment.TickCount.ToString(); }));
}
}
private void HandleClosingEvent(object sender, CancelEventArgs e) {
this.bgWorker.CancelAsync();
/////// while (this.bgWorker.CancellationPending) {} // deadlock
}
Run Code Online (Sandbox Code Playgroud) 我一直在努力使用这段代码一段时间,似乎无法找到我的问题的任何完整答案.我创建了一个小样本来说明问题:
<ListView >
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Margin="0,0,20,0" IsItemsHost="True" />
</ItemsPanelTemplate>
</ListView.ItemsPanel>
<ListView.Items>
<TextBlock>Test1</TextBlock>
<TextBlock>Test2</TextBlock>
<TextBlock>Test3</TextBlock>
<TextBlock>Test4</TextBlock>
<TextBlock>Test5</TextBlock>
</ListView.Items>
<ListView.ItemContainerStyle>
<Style TargetType="{x:Type ListViewItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListViewItem}">
<Grid>
<ContentPresenter/>
</Grid>
<ControlTemplate.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsMouseOver}" Value="True" />
<Condition Property="IsSelected" Value="True"/>
</MultiTrigger.Conditions>
<Setter Property="Visibility" Value="Collapsed"/>
</MultiTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListView.ItemContainerStyle>
</ListView>
Run Code Online (Sandbox Code Playgroud)
根据MultiTrigger设置,当鼠标不再位于所选项目上时,应重新显示所选项目.但是,此代码会生成一个InvalidOperationException,并显示消息"必须具有'Property'的非空值." 如果删除使用"绑定"属性的条件,则不会抛出异常.在MSDN文档中,它声明您必须设置Property或Binding属性.未设置上述代码函数,如Binding属性.实际上,在我的所有测试用例中,Binding属性的设置并不重要; 仍然抛出异常.有什么想法吗?
好的,我已经阅读了几个关于它的主题,但是在这里.让我们想象一下,我有一个应用程序,基本上每次我都会点击一个按钮,很多事情会发生几分钟,然后它会闲置一小时,或者只是1分钟.不会在整个结束好的情况后调用GC.Collect吗?我的意思是,我知道就在那一刻我不会使用我的应用程序,GC也无法猜测它.
在其他语言中,我可以设置方法签名
cookEgg(boolean hardBoiled = true)
Run Code Online (Sandbox Code Playgroud)
如果我在方法调用中没有收到参数,则默认将参数hardboiled设置为true.我如何在c#中实现这一目标?
非常感谢
当我有一个代码块
static void Main()
{
foreach (int i in YieldDemo.SupplyIntegers())
{
Console.WriteLine("{0} is consumed by foreach iteration", i);
}
}
class YieldDemo
{
public static IEnumerable<int> SupplyIntegers()
{
yield return 1;
yield return 2;
yield return 3;
}
}
Run Code Online (Sandbox Code Playgroud)
我可以将收益率收益背后的原理解释为
|1| |2| |3| are stored in contiguous memory block.Pointer of "IEnumerator" Moves to |1|澄清:
(1)通常我们将在函数内部允许一个有效的return语句.当多个yield return,yield return,...语句出现时C#如何处理?
(2)一旦遇到回报,就无法再次控制回到SupplyIntegers(),如果允许则不会再从1开始收益?我的意思是收益率1?
我可以使用代码进行struct初始化:
struct struct_type_id struct_name_id = { value1, value2, value3 };
Run Code Online (Sandbox Code Playgroud)
但不能用:
struct struct_type_id struct_name_id;
struct_name_id = { value1, value2, value3 };
Run Code Online (Sandbox Code Playgroud)
为什么我可以用前者来做,但是后者不能用gcc,g ++,vc2008,vc6?换句话说,为什么c/c ++编程语言不支持这种语法?
谢谢.
INotifyPropertyChanged是相当自我解释的,我想我很清楚何时提高那个(即我完成更新值时).
如果我实现了INotifyPropertyChanging,我会在进入setter或其他更改对象状态的方法后立即引发事件,然后继续执行可能发生的任何保护和验证.
因此,我将此事件视为通知,即该属性可能会更改但尚未更改,并且实际上可能无法成功完成更改.
如果对象的使用者正在使用这个属性(就像让我们说LINQ to SQL使用事件进行更改跟踪)我是否应该暂停并且只有在我验证了我给出的值是好的并且对象的状态对更改有效吗?
这次活动的合同是什么,订户会有什么副作用?
假设你有类似ASP.NET ASP:DetailsView来显示和编辑数据库中的单个记录.
记录错误案例很简单...您添加验证和验证摘要.当您的更新表单验证失败时,它会自然产生噪音:它会显示验证消息和/或验证摘要.不需要一个代码.
但是,然后,您通过验证,它会完全默默地进行更新.没有任何意义发生任何事情,似乎没有任何默认设置可以在没有代码隐藏的情况下制作成功消息.
但是,即使是代码隐藏也令人困惑.什么事件应该显示成功消息?onItemUpdate,对吧?很好,但是让我们说你做了另一个改变并得到验证错误?您的成功消息仍然存在 如果存在验证错误,我无法找到可靠地关闭现有成功消息的事件.
这应该是web开发101!为什么这么难?
编辑:
有人建议使用ItemCommand事件...我尝试了这个和许多其他事件,但成功消息不会消失.这是一些代码.
我在ASP.NET中的消息
<label id="successMessage" class="successMessage" runat="server"></label>
Run Code Online (Sandbox Code Playgroud)
我的DataView标签(简化):
<asp:DetailsView
Id="EditClient"
DataKeyNames="LicenseID"
DataSourceID="MySource"
runat="server"
OnItemUpdated="SuccessfulClientUpdate"
OnItemCommand="ClearMessages">
Run Code Online (Sandbox Code Playgroud)
而且,我的代码隐藏:
protected void SuccessfulClientUpdate(object sender, DetailsViewUpdatedEventArgs e)
{
successMessage.InnerText = string.Format("Your changes were saved.");
successMessage.Visible = true;
}
protected void ClearMessages(object sender, DetailsViewCommandEventArgs e)
{
successMessage.InnerText = string.Empty;
successMessage.Visible = false;
}
Run Code Online (Sandbox Code Playgroud)
然而,一旦我成功更新,似乎没有任何东西使该消息消失,甚至验证失败.
第二次编辑:
只是想明确我确实尝试将ClearMessages代码放在Page_Load中.但是,当我在第二次更新时遇到验证错误,似乎没有任何东西使successMessage标签消失.有人可以建议任何其他疑难解答提示
好吧,我希望这不是一个问题,但我的好奇心让我变得更好.我在一家大型保险公司工作.我们正在建立excel电子表格,处理人寿保险单未来现金价值的预测.这些是相当大的工作簿(40-50mb),有大量的工作表和列,必须考虑到大量的变量才能准确地预测现金价值.
如何将其构建为桌面或业务应用程序?我知道.net对初学者来说相当不错,但是我在电子表格思维之外思考问题以及如何将.net应用于这样的事情.如何在代码中跟踪计算,在电子表格中需要3个或4个页面,每行有600列,每行1300行?以及根据年龄,性别,吸烟者/非吸烟者等投入动态改变影响政策的利率,费用和其他因素......
我被指控在我公司设置CI服务器,我正在寻找一些关于我的项目需要什么构建配置的建议.作为第一步,我将构建设置为:
提交构建:编译代码并运行单元测试
集成构建:编译代码并运行长时间运行的集成测试
我不确定我还需要什么来完成CI图片.例如,你的商店里有什么构建配置?
我知道必须有一个步骤来部署我的成功构建,但是我会将部署作为Integration的一部分吗?
使用TeamCity,MSBsuild和SVN
寻找急需的建议.