Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 任务使用一种方法工作。如何防止代码重复?_C#_Task_Code Duplication - Fatal编程技术网

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

C# 任务使用一种方法工作。如何防止代码重复?,c#,task,code-duplication,C#,Task,Code Duplication,假设有两个任务: Task.Run(() => { while (!this.isCanceled) DoOperation(obj); }); 及 和DoOperation(Foo obj)实现: DoOperation(Foo obj) { if (obj.IsBar && obj.IsFoo) obj.MakeSad(); else obj.MakeHappy(); } 我们可以锁定方法DoO

假设有两个任务:

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

DoOperation(Foo obj)
实现:

DoOperation(Foo obj)
{
    if (obj.IsBar && obj.IsFoo)
        obj.MakeSad();
    else
        obj.MakeHappy();
}
我们可以锁定方法
DoOperation
,一切都应该很好,但这种方法有一些性能方面的负面影响。此外,使用
DoOperation
方法可以一次完成许多任务。 第二种方法是将整个方法复制到每个任务中。但情况更糟


因此,问题是如何避免锁定和防止代码重复?

如果您的操作失败,关键代码是什么?必须有一个或多个竞争条件,否则根本不需要使用锁

如果在您的示例中,它是
DoSomething
中的某个东西,则使用锁:

DoOperation(Foo obj)
{
    if (obj.IsBar && obj.IsFoo)
        obj.MakeSad();
    else {
        lock(lockObject1) {
             obj.MakeHappy();
        }
    }
}
这样,如果功能在不被阻止的情况下工作,您就不会复制代码和所有其他内容。如果使用了另一个有争议的块,请使用另一个锁定对象,这样它们就不会相互阻塞


顺便说一下,由于您使用的是任务和同步编程,因此锁定的更好的用户
信号量lim

如果您的操作失败,关键代码是什么?必须有一个或多个竞争条件,否则根本不需要使用锁

如果在您的示例中,它是
DoSomething
中的某个东西,则使用锁:

DoOperation(Foo obj)
{
    if (obj.IsBar && obj.IsFoo)
        obj.MakeSad();
    else {
        lock(lockObject1) {
             obj.MakeHappy();
        }
    }
}
这样,如果功能在不被阻止的情况下工作,您就不会复制代码和所有其他内容。如果使用了另一个有争议的块,请使用另一个锁定对象,这样它们就不会相互阻塞


顺便说一下,由于您使用的是任务和同步编程,因此用于锁定的更好的用户
SemaphoreSlim
DoSomething
方法没有问题,因为它处理不同的
Foo
对象,但是我认为这种方法在调用不同任务的不同对象时仍然会有一些问题。例如,有没有可能调用
obj.MakeHappy()
,其中堆栈中的obj地址类似于不同引用上的0x04a1(obj地址是0x9a2c)处理多个任务?
DoSomething
方法没有问题,因为它处理不同的
Foo
对象,但是我认为这个方法在调用不同任务的不同对象时仍然会有一些问题。例如,是否可以调用
obj.MakeHappy()
其中堆栈中的obj地址类似于处理多个任务的不同引用上的0x04a1(obj地址为0x9a2c)?