0

架空の例を次に示します。

WebCleint wc = new WebClient();

wc.DownloadStringCompleted += wc_DownloadStringCompleted;

wc.DownloadStringAsync(new Uri(callString));

wc = new WebClient();

wc.DownloadStringCompleted += wc_DownloadStringCompleted;

wc.DownloadStringAsync(new Uri(callString));

私の理解では、ガベージ コレクターは、完全に逆参照されるまで何かを取得しません。だから私の本当の質問は、イベント登録はオブジェクトへの参照としてカウントされますか?

この呼び出しを行って、両方の戻り値を同じ完了済みメソッドから戻すことはできますか?

さまざまな Web 呼び出しを行うことができます。それらはすべて非同期で行う必要があります。それらはすべてランダムな時間に発生する可能性があります。

今のところ、私が構築した方法で同時呼び出しが防止されると思いますが、それはものを構築する悪い方法です。

スタック キューの作成を回避しようとしています。

4

2 に答える 2

1

この質問に似ています:

イベント ハンドラーはガベージ コレクションの発生を停止しますか?

パブリッシャー (この場合は wc) は、ガベージ コレクションに影響を与えていないように見えます。wc はイベント ハンドラーへの参照を保持しますが、wc への参照を保持するものはありません。

于 2013-08-11T00:13:29.023 に答える
1

すべてのイベント登録は、現在のインスタンス (wc_DownloadStringCompleted を含むインスタンス) が解放されない限り、オブジェクト (WebClient) を存続させます。wc_DownloadStringCompleted でイベントの登録を解除できます。wc_DownloadStringCompleted で元の WebClient を取得するには、sender オブジェクトを使用します。

public void wc_DownloadStringCompleted(object sender, EventArgs e)
{
    WebClient  wc = (WebClient)sender;

    wc.DownloadStringCompleted -= wc_DownloadStringCompleted;

    // handle download completed
}
于 2013-08-11T00:08:02.943 に答える