【发布时间】:2015-02-17 03:24:45
【问题描述】:
我需要为我的函数调用设置超时以向 ui 发送反馈。
Task.Factory.StartNew(() => {
var task = Task.Factory.StartNew(() => {
lock(this) {
// do work
Thread.Sleep(5000);
}
});
// if the lock above blocks the thread, this might be timed out
if(task.Wait(timeout)) {
// done
} else {
// timeout
}
});
我最初的解决方案是我把锁放在内部任务之外
Task.Factory.StartNew(() => {
Monitor.Enter(obj);
var task = Task.Factory.StartNew(() => {
// do work
Thread.Sleep(5000);
Monitor.Exit(obj);
});
// if the lock above blocks the thread, task won't start.
if(task.Wait(timeout)) {
// done
} else {
// timeout
}
});
但它不起作用。
我的问题是,如何为我的任务指定超时但排除锁定等待?
【问题讨论】:
-
locking onthis是个好主意吗,是Task的标准(也许this在上下文中获取Task,也许不是?)? -
@GrantThomas 你可以假设
obj是一个实例字段,它没有任何区别,如果我有两个这样的函数,我就有麻烦了。你不能在一个线程中调用Monitor.Enter,而在另一个线程中调用Monitor.Exit。 -
@decPL 这不是我的问题。我不知道这是否是指定超时和排除锁等待的正确方法,也许不是?
-
@alrz 您不能从超时中“排除”任意部分的执行时间(您如何想象这样的结构可以工作?)。您将“违规”部分移到代码之外的想法是正确的(尽管您可能希望单独解决阻塞“主”线程的问题)。
-
@alrz:你为什么要使用锁?您真正想解决什么问题?
标签: c# asynchronous timeout locking task