私は.NET Core
の初心者です。私は、次の操作を実行するコンソールアプリケーションを実装しようとしています:.NETコアによる非同期プログラミング?
コンソールアプリケーションは、2つの外部APIの間の仲介として動作するはずです。例えば。 API-1およびAPI-2。
データを取得するために10ミリ秒ごとにAPI-1を呼び出す必要があります。
すぐにAPI-1から受信したデータを送信するためにAPI-2を呼び出します。
- コンソールアプリケーションはAPI-1がデータを受信するのを待つ必要がありますが、API-2からの応答を待つ必要はありません。
以下は私のコードです。期待どおりに動作しません。最初はAPI-1を予想どおり10ミリ秒で起動しますが、API-1を呼び出すのはAPI-2からの応答を受け取った後のみです。
API-2は20秒かかると仮定し、API-1も20秒後に呼び出されます。
API-2を非同期で呼び出してAPI-2レスポンスを待つ必要はありません。
namespace ConsoleApp1
{
public class Program
{
private static Timer _timer;
private const int TIME_INTERVAL_IN_MILLISECONDS = 10; // 10 milliseconds
private const int API2_DELAY = 20000; // 20 seconds
public static void Main(string[] args)
{
Dowork().Wait();
Console.WriteLine("Press Any Key to stop");
Console.ReadKey();
Console.WriteLine("Done");
}
private static async Task Dowork()
{
var data = new SomeData();
_timer = new Timer(CallAPI1, data, TIME_INTERVAL_IN_MILLISECONDS, Timeout.Infinite);
await Task.Yield();
}
private static async void CallAPI1(object state)
{
var data = state as SomeData;
Console.WriteLine("Calling API One to get some data.");
data.SomeStringValue = DateTime.Now.ToString();
await CallAPI2(data);
_timer.Change(TIME_INTERVAL_IN_MILLISECONDS, Timeout.Infinite);
}
private static async Task CallAPI2(SomeData data)
{
Console.WriteLine("Calling API Two by passing some data received from API One " + data.SomeStringValue);
// the delay represent long running call to API 2
await Task.Delay(API2_DELAY);
}
}
}
POCOクラス
namespace ConsoleApp1
{
public class SomeData
{
public string SomeStringValue { get; set; }
}
}
またそのAPI-1およびAPI-2の点に注意してください。ASP.NETコアに1
を開発されるアップデート1
私は文の上に言い換えてみましょう。 API-1は.Netコアで開発されますが、API-2はWindowsワークフローサービスです。つまり、WFに複数の呼び出しを行うことができます。 WFは要求を保持し、一度に1つずつ処理します。
更新2
提供されたすべての回答とリンクを通過した後。私はコンソールアプリケーションの代わりに仲介者としてWindowsサービスを使用することを考えています。今すぐ.Net core
はウィンドウサービスをサポートしていませんが、nuget-packageをWindowsサービス内で.Netコアをホストできるか、または4.6.2を使用して従来のWindowsサービスを使用している可能性があります。私はWindowsサービス内で非同期実装を行うこともできると思います。
C#でコンソールアプリケーションで[async]が重複している可能性があります(http://stackoverflow.com/questions/17630506/async-at-console-app-in-c) –
@ LP13なぜAPI2が遅いのですか?何してるの?遅いサービスへの複数の呼び出しを行うことは、おそらくそれを飽和させるでしょう。スレッド飢餓、I/O飽和などの問題が発生する可能性があります。より具体的にすることができます –
[async void]を避ける(https://msdn.microsoft.com/en-us/magazine/jj991977.aspx ) –