锁定语句中不允许使用C#(.NET Async CTP)中的await关键字.
来自MSDN:
await表达式不能用于同步函数,查询表达式,异常处理语句的catch或finally块,lock语句块或不安全上下文中.
我认为编译器团队出于某种原因要么难以实施,要么难以实现.
我尝试使用using语句:
class Async
{
public static async Task<IDisposable> Lock(object obj)
{
while (!Monitor.TryEnter(obj))
await TaskEx.Yield();
return new ExitDisposable(obj);
}
private class ExitDisposable : IDisposable
{
private readonly object obj;
public ExitDisposable(object obj) { this.obj = obj; }
public void Dispose() { Monitor.Exit(this.obj); }
}
}
// example usage
using (await Async.Lock(padlock))
{
await SomethingAsync();
}
Run Code Online (Sandbox Code Playgroud)
但是这不能按预期工作.在ExitDisposable.Dispose中对Monitor.Exit的调用似乎无限期地(大部分时间)阻塞,导致死锁,因为其他线程试图获取锁.我怀疑我的工作不可靠以及锁定语句中不允许等待语句的原因在某种程度上是相关的.
有谁知道为什么在锁定声明的正文中不允许等待?
我有一个滑块,它的值绑定到某个属性,并且属性一直在更新它.在拖动[thumb on]滑块的同时,我想阻止滑块的这个更新值进行绑定,直到用户完成它的拖动.
Slider上有没有任何属性可以做到这一点,或者我需要为此编写代码?
提前致谢!
在我的应用程序中,我使用两个滑杆来控制某些图像的亮度和对比度,并且当两个滑杆中的任何一个更改其值属性时,每次必须逐像素完全重新计算图像。较小图像的重新计算完全可以完成,不会造成任何问题,但是,较大图像需要重新计算,并且与鼠标指针相比,滑块的移动略有延迟。我确实需要实时或多或少地重新计算图像,因此只需在DragCompleted或类似是不可接受的。
重新计算使用 ValueChanged滑块 -event。我认为,如果不尽快触发该事件,但至少要等待50毫秒再触发一次,此问题的一种好的解决方案是,但是滑块是否具有可以控制该事件的属性?
我想到的另一种解决方案是,在事件得到处理后,从开始时立即从滑块中删除该事件,然后在短时间内再次将其添加,但这本身可能会导致一些延迟,因此在这里也不是优选的。
我真的在任何地方都找不到关于该主题的任何内容,因此,如果有人有我可以使用的任何好的建议或指示,我将非常感激。
我有一个与Caliburn.Micro的WPF应用程序.
我想处理滑块的移动,即MouseUp事件.
<Slider cal:Message.Attach="[Event MouseUp] = [Action OnSliderMouseUp($this)]"
Value="{Binding PlayerPosition, Mode=OneWay}" MinWidth="200"
VerticalAlignment="Center" Minimum="0"
Maximum="{Binding Player.NaturalDuration.TimeSpan.TotalMilliseconds}"/>
Run Code Online (Sandbox Code Playgroud)
在ViewModel中:
public void OnSliderMouseUp(Slider slider)
{
int blah = 9;
}
Run Code Online (Sandbox Code Playgroud)
OnSliderMouseUp()永远不会被称为.你能告诉我我错过了什么吗?
你可能会说它是如何在拖动时停止更新滑块值的重复?但老实说,解决方案从2011年开始,并没有为我工作(甚至评论了其他用户接受的答案),其他答案与我无关.所以请耐心等待.
这是我的问题:我有一个绑定到这样的值的滑块:
<Slider Name="AudioSlider" Value="{Binding AudioValue}"
Grid.Column="1" Grid.Row="1" Height="30"
SmallChange="1" Maximum="100"
IsSnapToTickEnabled="True"
IsMoveToPointEnabled="True"/>
Run Code Online (Sandbox Code Playgroud)
这就是价值:
private double _audioValue;
public double AudioValue
{
get { return _audioValue; }
set
{
if (_audioValue == value)
return;
_audioValue = value;
SendPacket(cockpitType, (byte)Index.AudioSlider, (byte)_audioValue);
OnPropertyChanged("AudioValue");
}
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,每次值发生变化时我都会发送一个数据包,当它更新拖动值时,它只是在服务器上发送垃圾邮件,这是必须要防止的.
我试图将滑块绑定到一个函数(mouseUp),但我无法通过这种方式获取值.
任何想法我能做什么?
非常感谢.
编辑:
这里的答案WPF:在用户拖动后触发事件的滑块对我没有帮助,因为它是数据模板中生成的滑块,事件与我无关.