依頼とコールバックの曖昧さ
2347 ワード
C++からC#に移動した人は、関数ポインタに相当する依頼をされたことを一般的に知られています.このように言うのは間違いないかもしれませんが、実は新人を誤解しやすいです.依頼はオブジェクトであり、関数ではなく、他の形式の存在ではなく、オブジェクトであり、定義されたときに関数に似ているだけですが、コンパイラはそれを自動的にオブジェクトclassに翻訳します.関数ポインタクラスで依頼するのは、関数のように見えるからです.その主な能力は1つの関数を通じて現れたが、それができることには1つの関数ポインタが含まれているが、それに限られない.
依頼の中で最も重要な2つの方法はinvokeとbeginInvokeであり,同期と非同期呼び出しの概念も引き出した.Invokeは簡単で、ブロックされた同期呼び出しであり、一般的な使用シーンの一つはオブジェクトAに依頼を設定し、外部から値を割り当て、必要に応じてInvokeを実行し、関数ポインタの形式でコールバックを実現し、オブジェクトAに「計画外」コードを実行させる目的を達成することができる.
beginInvokeといえば、依頼を別のスレッドとして使用し、依頼を定義した後に直接beginInvoke(null,null)を定義することで、別のスレッドにその依頼コードを実行させる効果を達成することができます.これは、自分でスレッドを作成したり、スレッドプールからスレッドを起動したりするよりも、コードが直感的で、役割ドメインを呼び出す局所変数を直接使用することができます.非常に便利です.
この使い方は、依頼スレッドにパラメータを入力したり、呼び出しスレッドを依頼スレッドの実行終了を待たせたりするなど、より多くのパターンを遊ぶことができます.これらの機能と最も基礎的なスレッド間の通信は理にかなっていますが、依頼はこれらのものをより便利にカプセル化して使用するだけで、ここでは多くは言いません.
この模様の中には誤解されやすいところがあります.beginInvokeが伝えた2つのパラメータ(少なくとも)です.1つはAsyncCallback(依頼です)です.1つはobjectパラメータです.なぜ依頼を伝えなければなりませんか.もともと依頼が実行されたのになぜ依頼を伝えなければならないのか、字面から理解するのはコールバックと呼ばれています.これは人間ではありませんか.まず、この依頼は伝えられても伝えられなくても、その行為も完全にあなたが定義していることを理解しなければなりません.それは依頼関数を呼び出して実行した後、実行する方法にすぎません.特別なことはありません.自分をコールバックと呼んでもいいです.依頼してもいいです.どうせそうなのですから、少しも珍しくありません.
次に、この概念はすでに耳を傾けているように、私はいつもいくつかの基礎があまりよくない同級生が自分の素養を修飾するのが好きだと感じています.何年も経っていますが、时には神秘的だと思います.また、时には簡単なようです.今日は必ず偽装を引き裂いて、みんなに見せてください.それは少しも神秘的ではありません.それは私があなたに一つのことをさせます.終わったら教えてください.あなたが教えてくれたのはコールバックです.実はこのように理解しても多少誤解があって、あなたは私に教えないことができて、あなたはただいくつかの私が知っている資源を利用して少し事をすることができて、それではあなたのこの行為は私もその名を回復と呼ぶことができます;あなたは私と何の関係もなく、私があなたに要求したことをした後、私が事前にあなたに伝えた依頼でinvoke操作を開始することができますが、操作の内容は私とは全く関係なく、私もこのinvokeを返事と呼ぶことができます(ほら、私はここであなたに返事をして、私の追い詰めはとても高いです).必ず明らかにしなければならないのは、コールバックという行為(プロセス、関数)は、あなたのスレッドの中で発生し、あなたのスレッドが私のものではなく、このプロセスを実行しているので、コールバックという字面の意味に誤解されないでください.私のスレッドがこの世代コードを呼び出していると思っています.もちろん、いくつかの技術手段で類似の目的を達成することができます.例えば、スイッチ変数を開いて、あなたが残したコードセグメントに行かせたり、事前に私に待ち伏せしていた依頼をアクティブにしたりして、私に自然に依頼の中であなたが計算したことをさせたりすることができます.冤罪の報いは尽きないが、真実は一つしかない.コールバックはあなたのスレッドから実行されている.
前に言ったように、こんなにたくさんのことは私たちが自分でまた游んで依頼したのですが、実は.NETはすでにそれを真っ青に游んで、linqを考えて、方法を広げて、どんな表现の各种のshowを考えて、しかし使い方はやはり上でまとめた2种类です:
関数ポインタとして使用します.スレッド用
.
依頼の中で最も重要な2つの方法はinvokeとbeginInvokeであり,同期と非同期呼び出しの概念も引き出した.Invokeは簡単で、ブロックされた同期呼び出しであり、一般的な使用シーンの一つはオブジェクトAに依頼を設定し、外部から値を割り当て、必要に応じてInvokeを実行し、関数ポインタの形式でコールバックを実現し、オブジェクトAに「計画外」コードを実行させる目的を達成することができる.
beginInvokeといえば、依頼を別のスレッドとして使用し、依頼を定義した後に直接beginInvoke(null,null)を定義することで、別のスレッドにその依頼コードを実行させる効果を達成することができます.これは、自分でスレッドを作成したり、スレッドプールからスレッドを起動したりするよりも、コードが直感的で、役割ドメインを呼び出す局所変数を直接使用することができます.非常に便利です.
{
int a, b//
...
Action action = new Action(() => {
Console.WriteLine((a + b).ToString());//
});
action.BeginInvoke(null, null);//
}
この使い方は、依頼スレッドにパラメータを入力したり、呼び出しスレッドを依頼スレッドの実行終了を待たせたりするなど、より多くのパターンを遊ぶことができます.これらの機能と最も基礎的なスレッド間の通信は理にかなっていますが、依頼はこれらのものをより便利にカプセル化して使用するだけで、ここでは多くは言いません.
この模様の中には誤解されやすいところがあります.beginInvokeが伝えた2つのパラメータ(少なくとも)です.1つはAsyncCallback(依頼です)です.1つはobjectパラメータです.なぜ依頼を伝えなければなりませんか.もともと依頼が実行されたのになぜ依頼を伝えなければならないのか、字面から理解するのはコールバックと呼ばれています.これは人間ではありませんか.まず、この依頼は伝えられても伝えられなくても、その行為も完全にあなたが定義していることを理解しなければなりません.それは依頼関数を呼び出して実行した後、実行する方法にすぎません.特別なことはありません.自分をコールバックと呼んでもいいです.依頼してもいいです.どうせそうなのですから、少しも珍しくありません.
次に、この概念はすでに耳を傾けているように、私はいつもいくつかの基礎があまりよくない同級生が自分の素養を修飾するのが好きだと感じています.何年も経っていますが、时には神秘的だと思います.また、时には簡単なようです.今日は必ず偽装を引き裂いて、みんなに見せてください.それは少しも神秘的ではありません.それは私があなたに一つのことをさせます.終わったら教えてください.あなたが教えてくれたのはコールバックです.実はこのように理解しても多少誤解があって、あなたは私に教えないことができて、あなたはただいくつかの私が知っている資源を利用して少し事をすることができて、それではあなたのこの行為は私もその名を回復と呼ぶことができます;あなたは私と何の関係もなく、私があなたに要求したことをした後、私が事前にあなたに伝えた依頼でinvoke操作を開始することができますが、操作の内容は私とは全く関係なく、私もこのinvokeを返事と呼ぶことができます(ほら、私はここであなたに返事をして、私の追い詰めはとても高いです).必ず明らかにしなければならないのは、コールバックという行為(プロセス、関数)は、あなたのスレッドの中で発生し、あなたのスレッドが私のものではなく、このプロセスを実行しているので、コールバックという字面の意味に誤解されないでください.私のスレッドがこの世代コードを呼び出していると思っています.もちろん、いくつかの技術手段で類似の目的を達成することができます.例えば、スイッチ変数を開いて、あなたが残したコードセグメントに行かせたり、事前に私に待ち伏せしていた依頼をアクティブにしたりして、私に自然に依頼の中であなたが計算したことをさせたりすることができます.冤罪の報いは尽きないが、真実は一つしかない.コールバックはあなたのスレッドから実行されている.
前に言ったように、こんなにたくさんのことは私たちが自分でまた游んで依頼したのですが、実は.NETはすでにそれを真っ青に游んで、linqを考えて、方法を広げて、どんな表现の各种のshowを考えて、しかし使い方はやはり上でまとめた2种类です:
関数ポインタとして使用します.スレッド用
.