[C#] استدعاء طريقة التزامن بشكل متزامن


Answers

يجب الحصول على awaiter ( GetAwaiter() ) وإنهاء الانتظار لإكمال المهمة غير المتزامنة ( GetResult() ).

string code = GenerateCodeAsync().GetAwaiter().GetResult();
Question

لدي طريقة async :

public async Task<string> GenerateCodeAsync()
{
    string code = await GenerateCodeService.GenerateCodeAsync();
    return code;
}

أحتاج إلى استدعاء هذه الطريقة من طريقة متزامنة.

كيف يمكنني القيام بذلك دون الحاجة إلى تكرار طريقة GenerateCodeAsync لكي يعمل هذا بشكل متزامن؟

تحديث

ومع ذلك لم يتم العثور على حل معقول.

ومع ذلك ، أرى أن HttpClient بالفعل على تنفيذ هذا النمط

using (HttpClient client = new HttpClient())
{
    // async
    HttpResponseMessage responseAsync = await client.GetAsync(url);

    // sync
    HttpResponseMessage responseSync = client.GetAsync(url).Result;
}



أحتاج إلى استدعاء هذه الطريقة من طريقة متزامنة.

من الممكن مع GenerateCodeAsync().Result أو GenerateCodeAsync().Wait() ، كما تقترح الإجابة الأخرى. سيؤدي ذلك إلى حظر مؤشر الترابط الحالي حتى اكتمال GenerateCodeAsync .

ومع ذلك ، تم وضع علامة على سؤالك مع asp.net ، كما تركت التعليق أيضًا:

كنت آمل في حل أبسط ، وأعتقد أن asp.net التعامل مع هذا أسهل بكثير من كتابة العديد من خطوط التعليمات البرمجية

نقطتي ، يجب أن لا يتم حظر على أسلوب غير متزامن في ASP.NET. سيؤدي ذلك إلى تقليل قابلية تطبيق الويب الخاص بك ، وقد يؤدي إلى حدوث حالة توقف تام (عند نشر استمرارية داخل GenerateCodeAsync إلى AspNetSynchronizationContext ). باستخدام Task.Run(...).Result إلغاء تحميل شيء ما إلى مؤشر ترابط تجمع ثم يضر التحجيم أكثر ، لأنه يتسبب 1 + مؤشر ترابط أكثر لمعالجة طلب HTTP محدد.

يحتوي ASP.NET على دعم مضمن للأساليب غير المتزامنة ، إما من خلال وحدات تحكم غير متزامنة (في ASP.NET MVC و Web API) أو مباشرة عبر AsyncManager و PageAsyncTask في ASP.NET الكلاسيكي. يجب عليك استخدامه. لمزيد من التفاصيل ، تحقق من هذه الإجابة .




Links