BeginInvoke()内で非同期メソッドを呼び出すと、「新しい」スレッドが生成されますか?

ブランドサウルス

スレッドプールからの「新しい」意味。

以下の例を考えると、私の仮定は次のとおりです。

  1. メインメソッドは1つのスレッドで実行されます(例:スレッド1)
  2. BeginInvokeは、プール内の使用可能なスレッドを使用してAsyncDemo.TestMethodを実行します(スレッド2)
  3. 非同期メソッド呼び出し、たとえばWebClient.UploadStringAsyncは、別の使用可能なスレッド(スレッド3)を使用します

3番目は、私の質問の出所です。WebClient.UploadStringAsyncの定義:指定された文字列を指定されたリソースにアップロードします。これらのメソッドは、呼び出し元のスレッドをブロックしません。

これは、プールで使用可能な別のスレッドを使用することを意味しますか?これはお勧めできないテクニック(非同期内の非同期)ですか?

私の最終的な目標は、一部のデータを非同期で投稿することであり(ファイア・アンド・フォーゲット)、以前はUploadStringAsyncを使用していました。ここで、BeginInvokeを使用して周囲のコードもカプセル化することにしましたが、UploadStringAsyncを代わりに同期メソッド(UploadString())に変更する必要があるかどうかを考えています。

助けてくれてありがとう!

public class AsyncMain 
{
    // The delegate will be called asynchronously.
    public delegate string AsyncMethodCaller(out int threadId);

    public static void Main() 
    {       
        // The asynchronous method puts the thread id here.
        int threadId;       

        //Create the delegate.
        AsyncMethodCaller caller = new AsyncMethodCaller(AsyncDemo.TestMethod);

        // Initiate the asychronous call.
        IAsyncResult result = caller.BeginInvoke(out threadId, null, null);     

        Console.WriteLine("In AsyncMain.Main() Thread {0} does some work.", Thread.CurrentThread.ManagedThreadId);

        // Call EndInvoke to wait for the asynchronous call to complete,
        // and to retrieve the results.
        string returnValue = caller.EndInvoke(out threadId, result);

        Console.WriteLine("The async call executed on thread {0}, has responded with \"{1}\". The result is {2}", threadId, returnValue, result);
    }
}


public class AsyncDemo 
{   
    // The method to be executed asynchronously.
    public static string TestMethod(out int threadId) 
    {
        //get threadId, assign it.
        threadId = Thread.CurrentThread.ManagedThreadId;
        Console.WriteLine("TestMethod() begins at thread {0}", threadId);

        //Do work

        //Do ASYNC Method such as: WebClient.UploadStringAsync

        return String.Format("I'm finished my work.");
    }
}
StriplingWarrior

これは、プールで使用可能な別のスレッドを使用することを意味しますか?

簡単な答え:はい。

  1. UploadStringAsyncのドキュメントによると:

    文字列は、スレッドプールから自動的に割り当てられるスレッドリソースを使用して非同期に送信されます。

  2. また、BeginInvokeは、スレッドプールのスレッドを使用して非同期動作を実行します。

これはお勧めできないテクニック(非同期内の非同期)ですか?

両方のレベルで非同期動作が必要な場合は、やらなければならないことを実行します。ただし、一般的には、機能する最も単純なコードを作成することをお勧めします。したがって、1レベルの間接参照だけで解決できる場合は、それを選択することをお勧めします。

残念ながら、新しいバージョンの.NETにアップグレードすることはできません。新しいバージョンでは、タスクを使用するだけで同じことをはるかに簡単に実行できるためです。

public static void Main() 
{       
    Task<string> task = AsyncDemo.TestMethod();

    Console.WriteLine("In AsyncMain.Main() Thread {0} does some work.", Thread.CurrentThread.ManagedThreadId);

    string returnValue = task.Result; // This will cause the main thread to block until the result returns.

    Console.WriteLine("The async call executed on thread {0}, has responded with \"{1}\". The result is {2}", threadId, returnValue, result);
}



public class AsyncDemo 
{   
    // The method to be executed asynchronously.
    public async static Task<string> TestMethod() 
    {
        Console.WriteLine("TestMethod() begins");

        //Do work

        await new WebClient().UploadStringTaskAsync("...", "...");

        return String.Format("I'm finished my work.");
    }
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

beginInvoke で呼び出された非同期メソッドでパラメータ値を取得します

分類Dev

Javaの同じクラスの別の同期メソッド内に作成された新しいスレッドから同期メソッドを呼び出す

分類Dev

非同期メソッドは、awaitを呼び出す前に使用されたスレッドとは異なるスレッドで続行されますか?

分類Dev

非同期スレッドでそれをテストする方法メソッドが呼び出されましたか?

分類Dev

非同期メソッドを非同期で呼び出しますか?

分類Dev

非同期ネストされたメソッドを呼び出す同期-非同期はパスの下で機能しますか?

分類Dev

新しいスレッドでメソッドを呼び出します(文字列からメソッド名)?

分類Dev

バックグラウンドワーカー内で非同期のメディエーターデッドロックが待機しています-スレッドがそれ自体を呼び出していることを検出する方法

分類Dev

起動して非同期タスクメソッドを忘れると、呼び出されないことがあります

分類Dev

Task.Factory.StartNewでメソッドを動的に呼び出すと、新しいCookieContainerでスレッドがキャンセルされました

分類Dev

内部呼び出しが自然に非同期ではない場合、どうすれば自然に非同期のメソッドを作成できますか?

分類Dev

`-dealloc`内で呼び出された非同期メソッドは、不要なゾンビオブジェクトを生成する可能性があります

分類Dev

非同期呼び出しが必ずしも別のスレッドで実行されるとは限らない場合、非同期呼び出しをブロックするとデッドロックが発生する可能性がありますか?

分類Dev

違いを待つ同期と非同期メソッドを呼び出しますか?

分類Dev

単体テストで非同期操作内のメソッド呼び出しをテストするにはどうすればよいですか

分類Dev

非同期メソッドC#のループ内で呼び出されるパラメーターとしてタスクを渡す

分類Dev

同期された非静的メソッド内で呼び出された場合、静的メソッドを同期化する必要がありますか?

分類Dev

BrowserControlのScriptingObjectの非同期メソッドから動的コールバック関数を呼び出すと、例外がスローされます

分類Dev

別のメソッドが呼び出されたときにメソッドを呼び出しますか?

分類Dev

非同期関数が同期的に呼び出されると、呼び出し先のスレッドはどうなりますか

分類Dev

awaitなしで呼び出されたasyncメソッドのawaitsはまだ非同期ですか?

分類Dev

非同期パイプからクラスメソッドを呼び出すことはできますか?

分類Dev

.thenを使用して非同期関数/メソッドを直接呼び出すことはできますか?

分類Dev

Invokeメソッドの呼び出しは非同期ですか?

分類Dev

NodeJS + Expressがループ内で非同期メソッドを呼び出す

分類Dev

Jest:componentDidMountで.thenの非同期メソッドが呼び出されるのを待ちます

分類Dev

EventListenerは、それを呼び出さなかったスレッドに戻っています。メインスレッドのメソッドを呼び出すと、デッドロックが発生します。

分類Dev

同期タスクからメソッドの非同期バージョンまたは同期バージョンを呼び出す方が良いですか?

分類Dev

インスタンスメソッドにモンキーパッチを適用するときに、新しい実装からオーバーライドされたメソッドを呼び出すことができますか?

Related 関連記事

  1. 1

    beginInvoke で呼び出された非同期メソッドでパラメータ値を取得します

  2. 2

    Javaの同じクラスの別の同期メソッド内に作成された新しいスレッドから同期メソッドを呼び出す

  3. 3

    非同期メソッドは、awaitを呼び出す前に使用されたスレッドとは異なるスレッドで続行されますか?

  4. 4

    非同期スレッドでそれをテストする方法メソッドが呼び出されましたか?

  5. 5

    非同期メソッドを非同期で呼び出しますか?

  6. 6

    非同期ネストされたメソッドを呼び出す同期-非同期はパスの下で機能しますか?

  7. 7

    新しいスレッドでメソッドを呼び出します(文字列からメソッド名)?

  8. 8

    バックグラウンドワーカー内で非同期のメディエーターデッドロックが待機しています-スレッドがそれ自体を呼び出していることを検出する方法

  9. 9

    起動して非同期タスクメソッドを忘れると、呼び出されないことがあります

  10. 10

    Task.Factory.StartNewでメソッドを動的に呼び出すと、新しいCookieContainerでスレッドがキャンセルされました

  11. 11

    内部呼び出しが自然に非同期ではない場合、どうすれば自然に非同期のメソッドを作成できますか?

  12. 12

    `-dealloc`内で呼び出された非同期メソッドは、不要なゾンビオブジェクトを生成する可能性があります

  13. 13

    非同期呼び出しが必ずしも別のスレッドで実行されるとは限らない場合、非同期呼び出しをブロックするとデッドロックが発生する可能性がありますか?

  14. 14

    違いを待つ同期と非同期メソッドを呼び出しますか?

  15. 15

    単体テストで非同期操作内のメソッド呼び出しをテストするにはどうすればよいですか

  16. 16

    非同期メソッドC#のループ内で呼び出されるパラメーターとしてタスクを渡す

  17. 17

    同期された非静的メソッド内で呼び出された場合、静的メソッドを同期化する必要がありますか?

  18. 18

    BrowserControlのScriptingObjectの非同期メソッドから動的コールバック関数を呼び出すと、例外がスローされます

  19. 19

    別のメソッドが呼び出されたときにメソッドを呼び出しますか?

  20. 20

    非同期関数が同期的に呼び出されると、呼び出し先のスレッドはどうなりますか

  21. 21

    awaitなしで呼び出されたasyncメソッドのawaitsはまだ非同期ですか?

  22. 22

    非同期パイプからクラスメソッドを呼び出すことはできますか?

  23. 23

    .thenを使用して非同期関数/メソッドを直接呼び出すことはできますか?

  24. 24

    Invokeメソッドの呼び出しは非同期ですか?

  25. 25

    NodeJS + Expressがループ内で非同期メソッドを呼び出す

  26. 26

    Jest:componentDidMountで.thenの非同期メソッドが呼び出されるのを待ちます

  27. 27

    EventListenerは、それを呼び出さなかったスレッドに戻っています。メインスレッドのメソッドを呼び出すと、デッドロックが発生します。

  28. 28

    同期タスクからメソッドの非同期バージョンまたは同期バージョンを呼び出す方が良いですか?

  29. 29

    インスタンスメソッドにモンキーパッチを適用するときに、新しい実装からオーバーライドされたメソッドを呼び出すことができますか?

ホットタグ

アーカイブ