小编A87*_*876的帖子

如何等待BackgroundWorker取消?

考虑一个对象的假设方法,为您做一些事情:

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)

但是这种死锁,因为IsBusyRunWorkerCompleted事件处理之后才会被清除,并且在应用程序空闲之前无法处理该事件.在工人完成之前,应用程序不会闲置.(另外,这是一个繁忙的循环 - 恶心.)

其他人已添加建议将其融入:

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)

.net c# multithreading backgroundworker

119
推荐指数
3
解决办法
8万
查看次数

Convert.ToInt32和(int)有什么区别?

以下代码抛出编译时错误,如

无法将'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)

我想知道:

  1. 为什么第一个代码会产生编译时错误?

  2. 2个代码片段之间的区别是什么?

c# type-conversion

52
推荐指数
3
解决办法
7万
查看次数

使用Environment.TickCount()的经过时间 - 避免换行

绝对值是否保护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帮助修改代码.

.net vb.net rollover gettickcount

1
推荐指数
1
解决办法
1万
查看次数

变量值更改时触发事件

也许我的问题会让你困惑.

我想根据我的字符串值更改触发事件.

我知道当字符串值改变时可以触发事件.

但问题是:我不知道字符串值何时会改变.

要解决此问题,请使用计时器持续监视字符串值的变化.

但我需要一个更好的解决方案.

很困惑,是吗?


例如,

我有一个DLL,比如MyDll.dll.

MyDll有一个名为STATUS的变量

该变量有两个值,"Success"或"InProgress".

"成功" - 如果一个方法,比如LongProcess,就完成了."InProgress" - 如果LongProcess仍在处理中.

在我的程序中,如果MyDll.STATUS具有"成功"值,我需要触发事件.

为实现这一目标,我可以使用定时器控制来持续监控值何时更改为"成功".

但我想要一些更好的方法来实现这一目标.有什么建议吗?

c# event-handling

1
推荐指数
1
解决办法
6572
查看次数