考虑一个对象的假设方法,为您做一些事情:
public class DoesStuff
{
BackgroundWorker _worker = new BackgroundWorker();
...
public void CancelDoingStuff()
{
_worker.CancelAsync();
//todo: Figure out a way to wait for BackgroundWorker to be cancelled.
}
}
Run Code Online (Sandbox Code Playgroud)
如何等待BackgroundWorker完成?
在过去,人们尝试过:
while (_worker.IsBusy)
{
Sleep(100);
}
Run Code Online (Sandbox Code Playgroud)
但是这种死锁,因为IsBusy在RunWorkerCompleted事件处理之后才会被清除,并且在应用程序空闲之前无法处理该事件.在工人完成之前,应用程序不会闲置.(另外,这是一个繁忙的循环 - 恶心.)
其他人已添加建议将其融入:
while (_worker.IsBusy)
{
Application.DoEvents();
}
Run Code Online (Sandbox Code Playgroud)
这样做的问题是Application.DoEvents()导致当前队列中的消息被处理,这会导致重入问题(.NET不可重入).
我希望使用一些涉及事件同步对象的解决方案,其中代码等待事件 - 工作者的RunWorkerCompleted事件处理程序设置.就像是:
Event _workerDoneEvent = new WaitHandle();
public void CancelDoingStuff()
{
_worker.CancelAsync();
_workerDoneEvent.WaitOne();
}
private void RunWorkerCompletedEventHandler(sender object, …Run Code Online (Sandbox Code Playgroud) 以下代码抛出编译时错误,如
无法将'string'类型转换为'int'
string name = Session["name1"].ToString();
int i = (int)name;
Run Code Online (Sandbox Code Playgroud)
而下面的代码编译成功并执行:
string name = Session["name1"].ToString();
int i = Convert.ToInt32(name);
Run Code Online (Sandbox Code Playgroud)
我想知道:
为什么第一个代码会产生编译时错误?
2个代码片段之间的区别是什么?
绝对值是否保护Environment.TickCount包装中的以下代码?
If Math.Abs((Environment.TickCount And Int32.MaxValue) - StartTime) >= Interval Then
StartTime = Environment.TickCount And Int32.MaxValue ' set up next interval
...
...
...
End If
Run Code Online (Sandbox Code Playgroud)
有没有更好的防范Environment.TickCount环绕的方法?
(这是.NET 1.1.)
编辑 - 根据Microsoft Environment.TickCount帮助修改代码.
也许我的问题会让你困惑.
我想根据我的字符串值更改触发事件.
我知道当字符串值改变时可以触发事件.
但问题是:我不知道字符串值何时会改变.
要解决此问题,请使用计时器持续监视字符串值的变化.
但我需要一个更好的解决方案.
很困惑,是吗?
例如,
我有一个DLL,比如MyDll.dll.
MyDll有一个名为STATUS的变量
该变量有两个值,"Success"或"InProgress".
"成功" - 如果一个方法,比如LongProcess,就完成了."InProgress" - 如果LongProcess仍在处理中.
在我的程序中,如果MyDll.STATUS具有"成功"值,我需要触发事件.
为实现这一目标,我可以使用定时器控制来持续监控值何时更改为"成功".
但我想要一些更好的方法来实现这一目标.有什么建议吗?