任务使用一种方法。如何防止代码重复?

让我们假设有两个任务:

Task.Run(() => {
    while (!this.isCanceled)
        DoOperation(obj);
});

Task.Run(() => {
    foreach(var obj in objects)   // Another objects' subset
        while(!this.isCancelled)
            DoOperation(obj);
});

DoOperation(Foo obj)实现:

DoOperation(Foo obj)
{
    if (obj.IsBar && obj.IsFoo)
        obj.MakeSad();
    else
        obj.MakeHappy();
}

我们可以锁定方法DoOperation,一切都应该很好,但是这种方法在性能方面存在一些负面影响。而且,使用DoOperation方法可以一次处理许多任务。 第二种方法是将整个方法复制到每个任务中。但情况更糟。

所以问题是如何避免锁定并防止代码重复?

bingojqliu5 回答:任务使用一种方法。如何防止代码重复?

如果您进行操作,关键代码是什么?必须有一个或多个比赛条件,或者根本不需要使用锁。

如果在您的示例中DoSomething中有东西,请在那儿使用锁:

DoOperation(Foo obj)
{
    if (obj.IsBar && obj.IsFoo)
        obj.MakeSad();
    else {
        lock(lockObject1) {
             obj.MakeHappy();
        }
    }
}

这样,您就不会复制代码,并且只要功能正常运行而不会被阻塞,其他所有代码都不会重复。如果使用另一个有争议的阻止,请使用另一个锁定对象,以使它们不会互相阻止。

顺便说一句,由于您正在使用任务和同步编程,因此更好的用户SemaphoreSlim用于锁定https://blog.cdemi.io/async-waiting-inside-c-sharp-locks/amp/

本文链接:https://www.f2er.com/2859898.html

大家都在问