Я ищу способ объяснить, что нецелесообразно сбрасывать бизнес-логику высокого уровня вызовами ReferenceEquals ().
Вот фрагмент кода, с которым у меня проблема (предварительное условие в методе, предназначенном для выброса, если мы находимся не в том потоке):
if (!object.ReferenceEquals(Thread.CurrentThread, RequestHandlerThread))
Надежно ли написать это вместо:
if (Thread.CurrentThread != RequestHandlerThread)
Я предложил использовать ManagedThreadIds в сравнении на основе того, что я часто вижу в руководствах. Противник говорит, что сравнение для референтного равенства кажется более объектно-ориентированным.
Вот (примерно) то, что я увидел в представлении Reflector System.Object с .NET 4.0. Помните, что класс Thread запечатан и не имеет перегрузки для оператора ==.
public static bool ReferenceEquals(object objA, object objB)
{
return (objA == objB);
}
public static bool Equals(object objA, object objB)
{
return (objA == objB ||
(objA != null && objB != null && objA.Equals(objB)));
}
Вот несколько основных тестов, проверяющих работу пула потоков ... Я пропустил какие-либо существенные тесты?
using System.Threading;
using System.Diagnostics;
using System.Threading.Tasks;
namespace ConsoleApplicationX
{
class Program
{
static readonly Thread mainThread;
static Program()
{
mainThread = Thread.CurrentThread;
}
static void Main(string[] args)
{
Thread thread = Thread.CurrentThread;
if (thread != Thread.CurrentThread)
Debug.Fail("");
if(Thread.CurrentThread != thread)
Debug.Fail("");
if (thread != mainThread)
Debug.Fail("");
var task = Task.Factory.StartNew(() => RunOnBackground(thread));
task.Wait();
var anotherThread = new Thread(new ParameterizedThreadStart(RunInAnotherThread));
anotherThread.Start(thread);
}
static void RunOnBackground(Thread fromInitial)
{
if (Thread.CurrentThread == fromInitial)
Debug.Fail("");
if (fromInitial != mainThread)
Debug.Fail("");
}
static void RunInAnotherThread(object fromInitialAsObject)
{
var fromInitial = (Thread)fromInitialAsObject;
if (Thread.CurrentThread == fromInitial)
Debug.Fail("");
if (fromInitial != mainThread)
Debug.Fail("");
}
}
}