我目前在WPF中制作MP3播放器,我想制作一个滑块,允许用户通过向左或向右滑动滑块来寻找MP3中的特定位置.
我已尝试使用该ValueChanged事件,但每次更改值时都会触发,因此如果将其拖动,事件将多次触发,我希望事件仅在用户完成拖动滑块时触发然后获取新事件价值.
我怎样才能做到这一点?
[更新]
我在MSDN上发现这篇文章基本上讨论了同样的事情,他们提出了两个"解决方案"; 要么继承Slider,要么在一个时间跨度后调用动作DispatcherTimer的ValueChanged事件中调用a.
你能想出比上面提到的更好的东西吗?
我有一个应用程序,我有一个共享资源(一个运动系统),可以由多个客户端访问.我有个别操作需要在移动期间访问系统,如果同时请求冲突操作,则应该抛出"忙"异常.我也有序列发生器需要获得对Motion系统的独占访问权,以执行多个操作,并穿插其他操作; 在整个序列中,没有其他客户端应该能够运行操作.
我传统上使用Thread-affinity接近它,因此Thread可以请求独占访问并运行与操作相对应的阻塞调用.虽然线程具有访问权限,但没有其他线程可以使用该资源.我现在遇到的问题是我已经开始使用async/await模式实现我的系统,以允许更清晰的序列器实现.问题是现在我的音序器并不总是在同一个线程上运行; 活动线程可以在回调过程中发生变化,因此不再容易确定我是否处于有效的上下文中以保持运行操作.一个注意事项是一些操作本身由等待组成,这意味着序列和单个操作都可以跨越多个线程.
我的问题:是否有人知道一个好的模式来处理由于异步/等待而存在线程切换时获取独占访问权限?
作为参考,我考虑过一些事情:
我可以创建一个自定义的SynchronizationContext,它将序列持续时间内的所有sequencer调用封送回单个Thread.这样可以让我重用现有的线程相关访问管理代码.缺点是每当我执行一个序列或操作时,这将需要专用一个线程(因为操作也可以跨越多个线程.)
创建一个可获取的访问令牌以传递给Operation方法,以证明您已获得访问权限.这具有使用令牌参数膨胀方法的缺点.
使用(2)中的访问令牌方法,但为Operations接口创建一个重复的接口实现,以便可以使用令牌"烘焙"实例化包装器.这会创建一些丑陋的胶水代码,但它会清除序列代码,以便它不再需要将令牌传递给每个方法.
我找到了关于这个例外的不同文章,但没有一个是我的情况.这是源代码:
class Program
{
private static Mutex mutex;
private static bool mutexIsLocked = false;
static void Main(string[] args)
{
ICrmService crmService =
new ArmenianSoftware.Crm.Common.CrmServiceWrapper(GetCrmService("Armsoft", "crmserver"));
//Lock mutex for concurrent access to workflow
mutex = new Mutex(true, "ArmenianSoftware.Crm.Common.FilterCtiCallLogActivity");
mutexIsLocked = true;
//Create object for updating filtered cti call log
ArmenianSoftware.Crm.Common.FilterCtiCallLog filterCtiCallLog =
new ArmenianSoftware.Crm.Common.FilterCtiCallLog(crmService);
//Bind events
filterCtiCallLog.CtiCallsRetrieved += new EventHandler<ArmenianSoftware.Crm.Common.CtiCallsRetrievedEventArgs>(filterCtiCallLog_CtiCallsRetrieved);
//Execute filter
try
{
filterCtiCallLog.CreateFilteredCtiCallLogSync();
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (mutexIsLocked)
{
mutexIsLocked = false; …Run Code Online (Sandbox Code Playgroud) 我不清楚(并且找不到足够明确的文档):在异步方法中使用lock关键字时:如果对象已经被阻塞,线程是否会被阻塞,或者它是否会在挂起状态下返回任务(不阻塞线程) ,并在释放锁时返回)?
在下面的代码中,行会阻塞线程吗?如果它阻塞线程(这是我的想法),是否有标准的阻塞解决方案?我正在考虑使用AsyncLock,但首先我想尝试标准的东西.
谢谢.
private object myLock = new object();
private async Task MyMethod1(){
lock (myLock ) {// <---- will this line cause a return of the current method as an Await method call would do if myLock was already locked.
....
}
}
// other methods that lock on myLock
Run Code Online (Sandbox Code Playgroud) 根据文件:
"a
SemaphoreSlim不使用Windows内核信号量".
是否有任何特殊资源SemaphoreSlim使得Dispose在SemaphoreSlim不再使用遗嘱时呼叫很重要?
当使用 async/await 关键字访问 C# 中的临界区时,通常不建议使用lock关键字或Monitor (为什么我不能在 lock 语句的主体中使用 'await' 运算符?),因为它会在这种情况下引入死锁其中锁定关键部分的线程可能不可用。
一般方法是使用SemaphoreSlim类。
我的问题是,既然SemaphoreSlim(1,1)和 lock 在功能上是相同的,为什么使用一个可以,但另一个会引入死锁?
是因为 SemaphoreSlim 可以从任何线程释放,而锁则由锁定它的线程独占“拥有”吗?
我在新框架中看到许多方法,它们async/await在C#中使用新的异步模式/语言支持.为什么没有Monitor.EnterAsync()或其他async lock机制可以尽快释放当前线程并返回lock?
我认为这是不可能的 - 问题是为什么?
我知道在同步世界中第一个片段是正确的,但是WaitAsync和async/await magic是什么?请给我一些.net内部.
await _semaphore.WaitAsync();
try
{
// todo
}
finally
{
_semaphore.Release();
}
Run Code Online (Sandbox Code Playgroud)
要么
try
{
await _semaphore.WaitAsync();
// todo
}
finally
{
_semaphore.Release();
}
}
Run Code Online (Sandbox Code Playgroud) 我在Async/Await函数中有一部分代码,我只希望一次执行一个线程.
通过创建新的SemaphoreSlim(1)并使用WaitAsync/Release,这相对简单.结果是第一个线程执行而其他线程等待然后逐个执行.
我想要实现的目标实际上略有不同.我希望其他线程不要等待,但要退出该函数(即我不想阻止其他线程).因此,如果有一个属性"NumberOfThreadsCurrentlyExecuting"我将有效地拥有一个If Semaphore.NumberOfThreadsCurrentlyExecuting> 0然后返回.
但这样的财产不存在.有没有人知道解决这个问题的方法?
谢谢查尔斯
我正在开发一个Web应用程序,其中有几个用户可以更新相同的记录.因此,如果用户同时更新同一记录,以避免出现问题,我将其更改保存在队列中.当每次保存发生时,我想调用一个在另一个线程上处理队列的方法,但我需要确保该方法不能在另一个线程中再次调用时运行.我已经阅读了几篇关于这个主题的帖子,但不确定什么对我的情况最好.以下是我现在的代码.这是处理它的正确方法吗?
public static class Queue {
static volatile bool isProcessing;
static volatile object locker = new Object();
public static void Process() {
lock (locker) {
if (!isProcessing) {
isProcessing = true;
//Process Queue...
isProcessing = false;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)