私は、ReferenceEquals()の呼び出しで高水準のビジネスロジックを振りかけるのが無理だと説明する方法を探しています。代わりに、これを書くためにスレッドを同等に比較する
if (!object.ReferenceEquals(Thread.CurrentThread, RequestHandlerThread))
それが信頼性はあります:ここで
は、私は(私たちは間違ったスレッドにしている場合はスローするように設計された方法では、前提条件)に問題があるコードスニペットですif (Thread.CurrentThread != RequestHandlerThread)
私がチュートリアルでよく見る内容に基づいて、比較でManagedThreadIdsを使用することを提案しました。 Adversaryによれば、参照平等の比較はオブジェクト指向のようだ。
Reflectorが.NET 4.0でSystem.Objectの見たところで見たもの(大まかに)です。 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("");
}
}
}
FWIW、私は個人的にSystem.Object.ReferenceEqualsが "operator =="の実装の外側で使用されているのを見たことがありません。 –
Equals()の実装で使用されるReferenceEquals()の実装 – sll