更具体地说,上下文切换的性能下降是否适用于处于等待状态的线程?
在什么条件或情况下,ManualResetEvent或WaitHandle可能会消耗资源?
我在生产服务中遇到一个问题,它包含一个"看门狗"计时器,用于检查主处理作业是否已经冻结(这与COM互操作问题有关,遗憾的是,在测试中无法再现).
以下是它目前的工作原理:
ManualResetEvent,处理单个项目(这不应该花费很长时间),然后设置事件.然后它继续处理任何剩余的项目.WaitOne(TimeSpan.FromMinutes(5))这次活动.如果结果为false,则重新启动服务.原因似乎是当多个项目等待处理时,处理Set()第一个项目之后和处理Reset()第二个项目之间的时间太短,并且WaitOne()似乎没有认识到事件已被设置.
我的理解WaitOne()是被阻塞的线程在Set()被调用时保证会收到一个信号,但我想我错过了一些重要的东西.
请注意,如果我在调用Thread.Sleep(0)后通过调用允许上下文切换Set(),则WaitOne()永远不会失败.
下面包含一个与我的生产代码产生相同行为的示例.WaitOne()有时会等待5秒并失败,即使Set()每800毫秒调用一次.
private static ManualResetEvent _handle;
private static void Main(string[] args)
{
_handle = new ManualResetEvent(true);
((Action) PeriodicWait).BeginInvoke(null, null);
((Action) PeriodicSignal).BeginInvoke(null, null);
Console.ReadLine();
}
private static void PeriodicWait()
{
Stopwatch stopwatch = new Stopwatch();
while (true)
{
stopwatch.Restart();
bool result = _handle.WaitOne(5000, false);
stopwatch.Stop();
Console.WriteLine("After …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个具有非空构造函数的单例并以同步方式访问它:因为我无法控制组件的初始化顺序,如果组件在初始化之前访问单例,则必须等待.
工厂方法只调用一次,我的启动阶段抛出异常
private static volatile GottwareExcelAddin _instance;
private static readonly ManualResetEvent InitializedEvent=new ManualResetEvent(false);
internal static Singleton CurrentInstance
{
get
{
InitializedEvent.WaitOne();
return _instance;
}
}
#endregion
private Singleton(String url, Int otherstuff)
{
// do stuff
InitializedEvent.Set();
}
#region public factory
[OnWorkerThread]
public static void Singleton(String spaceUrl, _Application excelApp)
{
if (_instance == null)
_instance = new Singleton(spaceUrl, excelApp);
}
Run Code Online (Sandbox Code Playgroud)
[OnWorkerThread]是一个使工厂在工作线程上运行的属性,工厂只调用一次.
当我启动myapp时,有时我会得到以下内容:
异常源:mscorlib异常类型:System.Runtime.InteropServices.SEHException异常消息:外部组件引发了异常.异常目标站点:WaitOneNative
---- Stack Trace ---- System.Threading.WaitHandle.WaitOneNative(waitableSafeHandle As SafeHandle,millisecondsTimeout As UInt32,hasThreadAffinity As Boolean,exitContext As Boolean)AddinExpress.RTD.2005.dll:N 00000(0x0)JIT System. Threading.WaitHandle.InternalWaitOne(waitableSafeHandle As SafeHandle,millisecondsTimeout …
我知道如何使用ManualResetEvent或同步原语(如Monitor)来等待事件和/或锁,但我想知道是否有办法实现如下所示:
ManualResetEvent resetEvent;
public string WaitForOneThousandMs()
{
resetEvent.Wait(1000);
if (WaitTime(resetEvent) <= 1000)
return "Event occured within 1000ms.";
else
return "Event did not occur within 1000ms.";
}
Run Code Online (Sandbox Code Playgroud)
1)等待1000ms以发生事件X.
2)如果事件发生在1000ms内,则执行路径A.
3)否则,执行路径B.
这基本上是一个条件等待函数,其中条件是我们必须等待多长时间,如果可能的话,实现它的最佳方法是什么?
我正在Objective-c中编写一个ssh包装器,我正在尝试实现一个命令应该执行的maxTime.我实现它的方式是:
主线程:
AsyncThread:
在C#中,我使用ManualResetEvents向MainThread发出信号,取得了很大的成功.在Objective-C中,我能找到的最接近的类是NSCondition,但似乎它不是为线程间通信而构建的.
事实上,我得到:
2012-05-22 00:31:05.761 libssh2-for-iOS [60821:11303]** - [NSCondition解锁]:条件('(null)')从没有锁定它的线程解锁
2012-05-22 00:31:05.763 libssh2-for-iOS [60821:11303]**打破_NSLockError()进行调试.
当我尝试使用它时.是否有另一种方法可以使用NSCondition或更好的方式让线程睡眠,直到它收到某种信号?
multithreading locking objective-c manualresetevent nscondition
我有一个控制台应用程序执行类方法(在另一个项目中).此方法异步执行对Web服务的POST(这是3分钟的冗长操作)并且具有回调,该回调返回受POST影响的记录数.与此同时,程序继续执行其他不到3分钟的事情,程序在回调返回之前退出.
在过去,我使用了如下所示的ManualResetEvent来防止完成,但在这种情况下,我的方法是在一个不同的类库中,我希望尽可能保持干净.
static ManualResetEvent resetEvent = new ManualResetEvent(false)
static void Main()
{
CallAsyncMethod();
// Do other things...
resetEvent.WaitOne(); // Blocks until "set"
}
void AsyncMethodCallback()
{
// Do processing on completion...
resetEvent.Set(); // Allow the program to exit
}
Run Code Online (Sandbox Code Playgroud)
如果没有用执行标志来污染被调用的类,我会感激任何帮助,想出一个干净的模式来完成这个任务.
c# ×4
.net ×1
.net-4.0 ×1
asynchronous ×1
c#-4.0 ×1
callback ×1
events ×1
locking ×1
nscondition ×1
objective-c ×1
singleton ×1