标签:multithreading async-await c
尝试回答以下question时,我写了这段代码:
using static MyNameSpace.Locker; //So that we don't need to specify the static class name before each call.
public class MainClass
{
public MainMethod()
{
Lock(new object()).Lock(new object()).RunAction(() => Console.WriteLine("Finished"));
}
}
public static class Locker
{
public static async Task<List<object>> Lock(object toLock, int timeout = -1)
{
await Task.Run(() => TryEnter(toLock, timeout));
return new List<object>() { toLock };
}
public static async Task<List<object>> Lock(
this Task<List<object>> lockedChain,
object toLock,
int timeout = -1)
{
await Task.Run(() => TryEnter(toLock, timeout));
await lockedChain;
lockedChain.Result.Add(toLock)
return lockedChain.Result;
}
public static async void RunAction(this Task<List<object>> lockChain, Action toRun)
{
await lockChain;
try
{
toRun.Invoke();
}
finally
{
foreach (var chainMember in lockChain.Result)
{
Monitor.Exit(chainMember);
}
}
}
private static void TryEnter(object toLock, int timeout = -1)
{
var success = false;
if (timeout > 0)
{
success = Monitor.TryEnter(toLock, timeout);
}
else
{
success = Monitor.TryEnter(toLock);
}
if (!success)
{
throw new TimeoutException();
}
}
}
但是,正如一些用户正确地指出的那样,这由于非常简单的原因而无法使用:由于这些方法是异步的,因此它们可能无法在同一线程上运行,因此在尝试释放Monitor时会引发异常.
如何确保监视器的Enter和Exit方法在同一线程上运行?
解决方法:
与其强制将锁操作强加到几乎不可能的同一线程上,还应使用非线程仿射的锁:SemaphoreSlim.它还具有本机异步支持(而不是阻止).
在您链接到的原始问题中,我改用this answer.似乎比包含很多人为复杂性的链解决方案更干净.代码质量与所使用的特定调用语法无关.仅仅通过将事物放在句法链中,就不能大大降低复杂性.
特别地,链式解决方案只是说Lock(new [] {lock1,lock2},()=> …);的一种复杂方式.我认为.所有的链条都会建立一个列表.使用使它变得更加简单,因为它消除了lambda. Lambda的可组合性较差,因为您无法像使用中那样从Lambda中返回.我认为您应该针对此目标:
using (MultiLock(new [] { lock1, lock2 }, timeout)) {
//...
}
标签:multithreading,async-await,c
来源: https://codeday.me/bug/20191118/2028637.html
本站声明:
1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。