সি # তে নিরাপদে কোনও অ্যাসিঙ্ক পদ্ধতিটি কীভাবে অপেক্ষা করতে হবে


321

আমার একটি asyncপদ্ধতি রয়েছে যা কোনও ডেটা ফেরত দেয় না:

public async Task MyAsyncMethod()
{
    // do some stuff async, don't return any data
}

আমি এটিকে অন্য পদ্ধতি থেকে কল করছি যা কিছু ডেটা দেয়:

public string GetStringData()
{
    MyAsyncMethod(); // this generates a warning and swallows exceptions
    return "hello world";
}

কলিং MyAsyncMethod()অপেক্ষা এটি একটি "কারণ ছাড়া যেহেতু এই কলে প্রতীক্ষিত করা হয় না, বর্তমান পদ্ধতি কল সম্পুর্ণ হওয়ার পূর্বে চালানোর চলতে চাক্ষুষ স্টুডিওতে সাবধানবাণী"। সেই সতর্কতার জন্য পৃষ্ঠায় এটি উল্লেখ করেছে:

আপনার কেবলমাত্র সতর্কতা দমন করার কথা বিবেচনা করা উচিত যদি আপনি নিশ্চিত হন যে আপনি অ্যাসিক্রোনাস কলটি শেষ হওয়ার অপেক্ষায় থাকতে চান না এবং তথাপি পদ্ধতিটি কোনও ব্যতিক্রম উত্থাপন করবে না

আমি নিশ্চিত আমি কলটি শেষ হওয়ার অপেক্ষা করতে চাই না; আমার দরকার নেই বা সময় লাগবে না। কিন্তু কলটি ব্যতিক্রম বাড়িয়ে তুলতে পারে

আমি এই সমস্যাটিতে কয়েকবার হোঁচট খেয়েছি এবং আমি নিশ্চিত যে এটি একটি সাধারণ সমস্যা যার একটি সাধারণ সমাধান অবশ্যই হবে।

ফলাফলের অপেক্ষা না করে আমি কীভাবে নিরাপদে একটি অ্যাসিঙ্ক পদ্ধতিতে কল করব?

হালনাগাদ:

লোকেরা আমাকে পরামর্শ দিচ্ছে যে আমি কেবল ফলাফলটির জন্য অপেক্ষা করছি, এটি এমন কোড যা আমাদের ওয়েব পরিষেবাদিতে (এএসপি.নেট ওয়েব এপিআই) ওয়েব অনুরোধের প্রতিক্রিয়া জানায়। কোনও ইউআই প্রসঙ্গে অপেক্ষা করা ইউআই থ্রেডকে মুক্ত রাখে, তবে ওয়েব অনুরোধ কলের অপেক্ষায় অনুরোধটির প্রতিক্রিয়া জানার আগে টাস্কটি শেষ হওয়ার অপেক্ষায় থাকবে, যার ফলে বিনা কারণে প্রতিক্রিয়া বার বাড়বে।


কেন কেবল একটি সমাপ্তির পদ্ধতি তৈরি করে সেখানে কেবল তা উপেক্ষা করবেন না? কারণ এটি যদি ব্যাকগ্রাউন্ড থ্রেডে চলছে। তারপরে এটি আপনার প্রোগ্রামটি যেভাবেই হোক বন্ধ করতে বাধা দেবে না।
ইয়াহিয়া

1
আপনি যদি ফলাফলটির জন্য অপেক্ষা করতে না চান তবে একমাত্র বিকল্প হ'ল সতর্কতাটিকে উপেক্ষা / দমন করা। আপনি যদি ফলাফল / ব্যতিক্রমের জন্য অপেক্ষা করতে চান তবেMyAsyncMethod().Wait()
পিটার রিচি

1
আপনার সম্পাদনা সম্পর্কে: এটি আমার কাছে বোধগম্য নয়। অনুরোধের পরে ক্লায়েন্টকে প্রতিক্রিয়াটি 1 সেকেন্ড প্রেরণ করা হয়েছে বলে বলুন এবং 2 সেকেন্ড পরে আপনার অ্যাসিঙ্ক পদ্ধতিটি একটি ব্যতিক্রম ছুঁড়ে দেয়। এই ব্যতিক্রম নিয়ে আপনি কী করবেন? আপনার প্রতিক্রিয়া ইতিমধ্যে প্রেরিত থাকলে আপনি এটি ক্লায়েন্টকে প্রেরণ করতে পারবেন না। আপনি এর সাথে আর কি করবেন?

2
@ রোমোকু ফেয়ার যথেষ্ট। ধরে নিচ্ছি যে কেউ লগের দিকে তাকিয়ে আছে। :)

2
এএসপি.নেট ওয়েব এপিআইয়ের দৃশ্যের একটি প্রকরণটি একটি দীর্ঘকালীন প্রক্রিয়াতে (যেমন, একটি উইন্ডোজ পরিষেবা) একটি স্ব-হোস্টেড ওয়েব এপিআই, যেখানে একটি অনুরোধ ব্যয়বহুল কিছু করার জন্য একটি দীর্ঘ পটভূমি টাস্ক তৈরি করে, তবে এখনও করতে চায় এইচটিটিপি 202 (স্বীকৃত) দিয়ে দ্রুত প্রতিক্রিয়া পান।
ডেভিড রুবিন

উত্তর:


186

আপনি যদি "অবিচ্ছিন্নভাবে" ব্যতিক্রমটি পেতে চান তবে আপনি এটি করতে পারেন:

  MyAsyncMethod().
    ContinueWith(t => Console.WriteLine(t.Exception),
        TaskContinuationOptions.OnlyOnFaulted);

এটি আপনাকে "মূল" থ্রেড ব্যতীত অন্য কোনও থ্রেডে ব্যতিক্রম মোকাবেলার অনুমতি দেবে। এর অর্থ MyAsyncMethod()যে থ্রেডগুলি কল করছে তার থেকে কলটির জন্য আপনাকে "অপেক্ষা" করতে হবে না MyAsyncMethod; তবে, তবুও আপনাকে ব্যতিক্রম সহ কিছু করার অনুমতি দেয় - তবে কেবল ব্যতিক্রম ঘটে if

হালনাগাদ:

প্রযুক্তিগতভাবে, আপনি এর সাথে একই রকম কিছু করতে পারেন await:

try
{
    await MyAsyncMethod().ConfigureAwait(false);
}
catch (Exception ex)
{
    Trace.WriteLine(ex);
}

... যা আপনাকে যদি বিশেষভাবে try/ catch(বা using) ব্যবহারের প্রয়োজন হয় তবে এটি কার্যকর হবে তবে আমি ContinueWithকিছুটা আরও সুস্পষ্ট বলে মনে করি কারণ এর ConfigureAwait(false)অর্থ কী তা আপনাকে জানতে হবে ।


7
আমি এটিকে একটি এক্সটেনশান পদ্ধতিতে পরিণত করেছি Task: পাবলিক স্ট্যাটিক ক্লাস অ্যাসিঙ্ক ইউটিলিটি {সার্বজনীন স্ট্যাটিক শূন্য পারফরম্যান্সসিঙ্কটাস্ক উইথআউটইয়েট (এই টাস্ক টাস্ক, অ্যাকশন <টাস্ক> এক্সটেন্ডহ্যান্ডলার) {ওয়ার ডামি = টাস্ক। কনটিনিউউইথ (টি => ব্যতিক্রমহ্যান্ডলার (টি), টাস্ক কনটিনিউশনঅপশনসঅনলাইন); ; Age ব্যবহার: MyAsyncMethod ()। PerformAsyncTaskWithoutAwait (t => log.Error Format ("মাইএএনসিঙ্কথোডকে ফোন করার সময় একটি ত্রুটি ঘটেছে: \ n {0}", t.Exception));
মার্ক এভিনিয়াস

2
downvoter। মন্তব্য? উত্তরে যদি কিছু ভুল হয় তবে আমি জানতে এবং / অথবা ঠিক করতে পছন্দ করব।
পিটার রিচি

2
আরে - আমি ডাউনওয়েট করিনি, তবে ... আপনি কি নিজের আপডেটটি ব্যাখ্যা করতে পারবেন? কলটির অপেক্ষার কথা ছিল না, সুতরাং আপনি যদি এটির মতো করে থাকেন, তবে আপনি কলটির জন্য অপেক্ষা করবেন না, আপনি কেবল ধরা পড়া প্রসঙ্গেই চালিয়ে যাবেন না ...
বার্তোস্জ

1
"অপেক্ষা" এই প্রসঙ্গে সঠিক বর্ণনা নয়। ConfiguratAwait(false)টাস্কটি শেষ না হওয়া অবধি লাইনটি কার্যকর করা হয় না, তবে বর্তমান থ্রেড "অপেক্ষা" করে না (অর্থাত্ ব্লক), পরবর্তী লাইনে অপেক্ষার প্রার্থনা করার জন্য অ্যাসিঙ্ক্রোনালি বলা হয়। ConfigureAwait(false)পরবর্তী লাইনটি ছাড়া মূল ওয়েব অনুরোধ প্রসঙ্গে কার্যকর করা হবে। সঙ্গে ConfigurateAwait(false)এটা ASYNC পদ্ধতি (কাজের) হিসাবে একই প্রেক্ষাপটে মৃত্যুদন্ড কার্যকর করে, ধরে চলতে থাকার জন্য মূল প্রসঙ্গে / থ্রেড freeing ...
পিটার রিচি

15
চালিয়ে যাওয়া উইথ সংস্করণটি চেষ্টা {অপেক্ষার} ধরা {} সংস্করণের মতো নয়। প্রথম সংস্করণে, চালিয়ে যাওয়া () এর পরে সমস্ত কিছু সঙ্গে সঙ্গে কার্যকর হবে। প্রাথমিক কাজটি বরখাস্ত করা হয় এবং ভুলে যায়। দ্বিতীয় সংস্করণে, ক্যাচ after after এর পরে সমস্ত কিছুই প্রাথমিক কাজ শেষ হয়ে গেলেই কার্যকর করা হবে। দ্বিতীয় সংস্করণ "অপেক্ষায় রয়েছেন MyAsyncMethod () সমতূল্য ContinueWith (টি => Console.WriteLine (t.Exception), TaskContinuationOptions.OnlyOnFaulted) .ConfigureAwait (Fals);।
Thanasis Ioannidis

67

আপনার প্রথমে GetStringDataকোনও asyncপদ্ধতি তৈরি করার বিষয়টি বিবেচনা করা উচিত এবং তা awaitথেকে কাজটি ফিরে আসা উচিত MyAsyncMethod

যদি আপনি পুরোপুরি নিশ্চিত হন যে আপনার কখন থেকে ব্যতিক্রমগুলি পরিচালনা করতে হবে MyAsyncMethod বা এটি কখন শেষ হবে তা জানতে হবে না, তবে আপনি এটি করতে পারেন:

public string GetStringData()
{
  var _ = MyAsyncMethod();
  return "hello world";
}

বিটিডাব্লু, এটি কোনও "সাধারণ সমস্যা" নয়। এটা কিছু কোড চালানো এবং গ্রাহ্য না তা পূর্ণ করুক খুব দুর্লভ এবং গ্রাহ্য না তা সফলভাবে সমাপ্ত হবে।

হালনাগাদ:

যেহেতু আপনি এএসপি.এনইটি-তে রয়েছেন এবং তাড়াতাড়ি ফিরে আসতে চাইছেন, আপনি এই বিষয়টিতে আমার ব্লগ পোস্টটি দরকারী খুঁজে পেতে পারেন । তবে, এএসপি.এনইটি এটির জন্য ডিজাইন করা হয়নি এবং প্রতিক্রিয়া ফিরে আসার পরে আপনার কোডটি চলবে কিনা তার কোনও গ্যারান্টি নেই । এএসপি.এনইটি এটি চালানোর জন্য যথাসাধ্য চেষ্টা করবে তবে এটি এর গ্যারান্টি দিতে পারে না।

সুতরাং, লগের মধ্যে এমন কোনও ইভেন্ট টস করার মতো সাধারণ কোনও কিছুর জন্য এটি একটি সূক্ষ্ম সমাধান, যেখানে আপনি এখানে এবং সেখানে কিছু হারিয়ে ফেলেন তা আসলেই কিছু যায় আসে না । এটি কোনও ধরণের ব্যবসায়িক-সমালোচনামূলক ক্রিয়াকলাপের জন্য ভাল সমাধান নয়। এই পরিস্থিতিতে, ক্রিয়াকলাপগুলি সংরক্ষণ করার জন্য অবিচ্ছিন্ন পদ্ধতিতে (যেমন, অ্যাজুরি ক্যুইস, এমএসএমকিউ) এবং তাদের প্রক্রিয়াজাতকরণের জন্য একটি পৃথক পটভূমি প্রক্রিয়া (যেমন, অ্যাজুরি ওয়ার্কার রোল, উইন 32 পরিষেবা) আপনাকে অবশ্যই আরও জটিল আর্কিটেকচার গ্রহণ করতে হবে


2
আমি মনে করি আপনি ভুল বুঝে থাকতে পারেন। আমি কি করতে যদি এটা ব্যতিক্রম ছোঁড়ার এবং ব্যর্থ যত্ন, কিন্তু আমি আমার ডেটা ফেরার আগে পদ্ধতি অপেক্ষা আছে চাই না। এছাড়াও আমি যে প্রসঙ্গে কাজ করছি তাতে আমার সম্পাদনাটি দেখুন যদি এতে কোনও পার্থক্য আসে।
জর্জ পাওয়েল

5
@ জর্জিপোয়েল: একটি সক্রিয় অনুরোধ ছাড়াই একটি এএসপি.নেট প্রসঙ্গে কোড চালানো খুব বিপজ্জনক। আমার একটি ব্লগ পোস্ট রয়েছে যা আপনাকে সাহায্য করতে পারে তবে আপনার সমস্যাটি সম্পর্কে আরও কিছু না জেনে আমি এই পদ্ধতির সুপারিশ করব কিনা তা আমি বলতে পারছি না।
স্টিফেন ক্লিয়ারি

পুনঃটুইট আমার উদাহরণস্বরূপ, মেঘে চালনার জন্য আমার কাছে ব্যাচ প্রসেসিং ইঞ্জিন প্রয়োজন / আছে, আমি ব্যাচ প্রসেসিং বন্ধ করার জন্য শেষ পয়েন্টটি "পিং" করব, তবে আমি সঙ্গে সঙ্গে ফিরে আসতে চাই return পিং করার পরে এটি এটি শুরু হয়ে যায়, এটি সেখান থেকে সবকিছু পরিচালনা করতে পারে। যদি সেখানে ফেলে দেওয়া ব্যতিক্রমগুলি থাকে, তবে তারা কেবলমাত্র আমার "ব্যাচপ্রসেসলগ / ত্রুটি" টেবিলগুলিতে
লগইন করতেন

8
সি # 7, আপনি প্রতিস্থাপন করতে পারেন var _ = MyAsyncMethod();সঙ্গে _ = MyAsyncMethod();। এটি CS4014 সতর্ক করার বিষয়টি এখনও এড়িয়ে যায়, তবে এটি কিছুটা স্পষ্ট করে তোলে যে আপনি ভেরিয়েবলটি ব্যবহার করছেন না।
ব্রায়ান

48

পিটার রিচির উত্তর আমি যা চেয়েছিলাম তা ছিল এবং এএসপি.নেট শুরুর দিকে ফিরে আসার বিষয়ে স্টিফেন ক্লিয়ারির নিবন্ধটি খুব সহায়ক ছিল।

আরও সাধারণ সমস্যা হিসাবে তবে (কোনও এএসপি.এনইটি প্রসঙ্গে নির্দিষ্ট নয়) নিম্নলিখিত কনসোল অ্যাপ্লিকেশনটি ব্যবহার করে পিটারের উত্তরের ব্যবহার এবং আচরণ প্রদর্শন করে Task.ContinueWith(...)

static void Main(string[] args)
{
  try
  {
    // output "hello world" as method returns early
    Console.WriteLine(GetStringData());
  }
  catch
  {
    // Exception is NOT caught here
  }
  Console.ReadLine();
}

public static string GetStringData()
{
  MyAsyncMethod().ContinueWith(OnMyAsyncMethodFailed, TaskContinuationOptions.OnlyOnFaulted);
  return "hello world";
}

public static async Task MyAsyncMethod()
{
  await Task.Run(() => { throw new Exception("thrown on background thread"); });
}

public static void OnMyAsyncMethodFailed(Task task)
{
  Exception ex = task.Exception;
  // Deal with exceptions here however you want
}

GetStringData()গোড়ার দিকে অপেক্ষা ছাড়া আয় MyAsyncMethod()এবং ব্যতিক্রমগুলি নিক্ষিপ্ত MyAsyncMethod()সঙ্গে মোকাবিলা করা হয় OnMyAsyncMethodFailed(Task task)এবং না মধ্যে try/ catchপ্রায়GetStringData()


9
Console.ReadLine();সামান্য ঘুম / দেরীতে সরিয়ে ফেলুন এবং MyAsyncMethodআপনি ব্যতিক্রমটি কখনই দেখতে পাবেন না see
tymtam

17

আমি এই সমাধানটি শেষ করছি:

public async Task MyAsyncMethod()
{
    // do some stuff async, don't return any data
}

public string GetStringData()
{
    // Run async, no warning, exception are catched
    RunAsync(MyAsyncMethod()); 
    return "hello world";
}

private void RunAsync(Task task)
{
    task.ContinueWith(t =>
    {
        ILog log = ServiceLocator.Current.GetInstance<ILog>();
        log.Error("Unexpected Error", t.Exception);

    }, TaskContinuationOptions.OnlyOnFaulted);
}

7

এটিকে আগুন এবং ভুলে যাওয়া বলা হয় এবং এর জন্য একটি এক্সটেনশন রয়েছে

একটি কার্য গ্রহণ করে এবং এটি দিয়ে কিছুই করে না। অ্যাসিঙ্ক পদ্ধতির মধ্যে অ্যাসিঙ্ক পদ্ধতিতে আগুন এবং ভুলে যাওয়া কলগুলির জন্য দরকারী।

নুগেট প্যাকেজ ইনস্টল করুন ।

ব্যবহার করুন:

MyAsyncMethod().Forget();

11
এটি কিছুই করে না, সতর্কতা সরিয়ে ফেলার এটি কেবল কৌশল। Github.com/microsoft/vs-threading/blob/master/src/…
পাওলো ফুলগনি

2

আমার মনে হয় প্রশ্ন উঠেছে, আপনার এটি করার দরকার হবে কেন? asyncসি # 5.0 এর কারণটি তাই আপনি কোনও ফলাফলের জন্য অপেক্ষা করতে পারেন। এই পদ্ধতিটি আসলে অবিচ্ছিন্ন নয়, কেবল বর্তমান সময়ে থ্রেডের সাথে খুব বেশি হস্তক্ষেপ না করার জন্য এমন সময়ে ডাকা হয়।

সম্ভবত কোনও থ্রেড শুরু করা এবং এটি নিজে থেকে শেষ করার জন্য রেখে দেওয়া ভাল।


2
asyncফলাফলটির "অপেক্ষা" করার চেয়ে কিছুটা বেশি। "অপেক্ষা" বলতে বোঝায় যে "অপেক্ষার" অনুসরণকারী রেখাগুলি একই প্রতীক হিসাবে অপেক্ষারত একই প্রতীক হিসাবে "অপেক্ষা" করা হয়েছে। এটি অবশ্যই "অপেক্ষা" ছাড়াই করা যেতে পারে, অবশ্যই, তবে আপনি বেশ কিছু প্রতিনিধি রেখেছেন এবং কোডটির ক্রমবর্ধমান চেহারা এবং অনুভূতি হারাবেন (পাশাপাশি ব্যবহারের দক্ষতা usingএবং try/catch...
পিটার রিচি

1
@ পিটাররিচি আপনার একটি পদ্ধতি থাকতে পারে যা কার্যত অ্যাসিনক্রোনাস, awaitকীওয়ার্ডটি ব্যবহার করে না এবং কীওয়ার্ডটি ব্যবহার করে না async, তবে সেই পদ্ধতির সংজ্ঞা asyncব্যবহার awaitনা করে কীওয়ার্ডটি ব্যবহার করার কোনও অর্থ নেই ।
পরিবেশন করুন

1
@ পিটাররিচি বিবৃতি থেকে: " asyncফলাফলের অপেক্ষা" করার চেয়ে "কিছুটা বেশি"। asyncশব্দ (আপনি উহ্য এটা ব্যাকটিক এটা পরিক্ষেপ দ্বারা শব্দ থাকবে) মানে কিছুই ফলাফলের অপেক্ষা বেশি। এটি সাধারণ সিএস ধারণাগুলি হিসাবে এটি অ্যাসিনক্রোনাই, এর অর্থ কেবল কোনও ফলাফলের জন্য অপেক্ষা করা নয়।
পরিবেশন করুন

1
@ সার্ভে asyncএকটি রাষ্ট্রীয় মেশিন তৈরি করে যা অ্যাসিঙ্ক পদ্ধতিতে যে কোনও অপেক্ষার ব্যবস্থা করে। যদি awaitপদ্ধতির মধ্যে কোনও এস না থাকে তবে এটি এখনও সেই রাষ্ট্রীয় মেশিন তৈরি করে - তবে পদ্ধতিটি অ্যাসিঙ্ক্রোনাস নয়। এবং যদি asyncপদ্ধতিটি ফিরে আসে void, অপেক্ষা করার মতো কিছুই নেই। সুতরাং, এটি কেবল ফলাফল অপেক্ষা করার চেয়ে আরও বেশি কিছু
পিটার রিচি

1
@ পিটাররিচি যতক্ষণ পদ্ধতিটি কোনও টাস্ক দেয় ততক্ষণ আপনি এটির জন্য অপেক্ষা করতে পারেন। স্টেট মেশিন বা asyncকীওয়ার্ডের দরকার নেই। আপনাকে যা করতে হবে (এবং সেই বিশেষ ক্ষেত্রে স্টেট মেশিনের সাথে শেষ পর্যন্ত আসলে ঘটবে) হ'ল পদ্ধতিটি সুসংগতভাবে চালিত হয় এবং তারপরে একটি সম্পূর্ণ কার্যে আবৃত হয়। আমি মনে করি প্রযুক্তিগতভাবে আপনি কেবল রাষ্ট্রের যন্ত্রটি সরাবেন না; আপনি রাষ্ট্রের মেশিনটি সরিয়ে ফেলুন এবং তারপরে কল করুন Task.FromResult। আমি ধরে নিয়েছি যে আপনি (এবং সংকলক লেখকগণ) আপনার নিজের মধ্যে সংযোজন যোগ করতে পারেন।
পরিবেশন করুন

0

বার্তা লুপযুক্ত প্রযুক্তিগুলিতে (এএসপি তাদের মধ্যে একটি কিনা তা নিশ্চিত নয়), আপনি টাস্কটি শেষ না হওয়া অবধি লুপটি অবরোধ করতে পারেন এবং বার্তাগুলি প্রক্রিয়া করতে পারেন, এবং কোডটি অবরুদ্ধ করার জন্য চালিয়ে যান:

public void WaitForTask(Task task)
{
    DispatcherFrame frame = new DispatcherFrame();
    task.ContinueWith(t => frame.Continue = false));
    Dispatcher.PushFrame(frame);
}

এই পদ্ধতির শোডায়ালগ ব্লক করা এবং এখনও ইউআইকে প্রতিক্রিয়াশীল রাখার অনুরূপ।


0

আমি এখানে পার্টিতে দেরি করেছি, তবে আমি একটি দুর্দান্ত লাইব্রেরি ব্যবহার করছি যা আমি অন্য উত্তরে উল্লেখ করেছি

https://github.com/brminnick/AsyncAwaitBestPractices

আপনার যদি "ফায়ার অ্যান্ড ভুলে যাওয়া" দরকার হয় তবে আপনাকে কার্যটিতে এক্সটেনশন পদ্ধতিটি কল করুন।

কলটিতে এক্সেকশনটি অ্যাকশনটি পাস করা নিশ্চিত করে যে আপনি উভয় পৃথিবীর সেরাটি পেতে পারেন - কার্যকর করার অপেক্ষায় থাকা এবং আপনার ব্যবহারকারীদের মন্থর করার প্রয়োজন নেই, যদিও ব্যতিক্রমী পদ্ধতিতে ব্যতিক্রমটি পরিচালনা করার ক্ষমতা বজায় রেখে।

আপনার উদাহরণে আপনি এটি ব্যবহার করুন:

   public string GetStringData()
    {
        MyAsyncMethod().SafeFireAndForget(onException: (exception) =>
                    {
                      //DO STUFF WITH THE EXCEPTION                    
                    }); 
        return "hello world";
    }

এটি আমার এমভিভিএম জ্যামারিন সমাধানের জন্য দুর্দান্ত যে আইকনমন্ডটি বাস্তবায়ন করছে প্রতীক্ষিত অ্যাসিঙ্ক কম্যান্ডগুলি দেয়


-1

সমাধানটি সংশ্লেষের প্রসঙ্গ ছাড়াই এইচটিপিপি্লিয়েন্টকে অন্য কার্যকরকরণ কার্যে শুরু করা:

var submit = httpClient.PostAsync(uri, new StringContent(body, Encoding.UTF8,"application/json"));
var t = Task.Run(() => submit.ConfigureAwait(false));
await t.ConfigureAwait(false);

-1

আপনি যদি সত্যিই এটি করতে চান। শুধু "অপেক্ষা না করে সি # তে একটি অ্যাসিঙ্ক পদ্ধতি কল করুন" ঠিকানার জন্য, আপনি এ এর ​​মধ্যে অ্যাসিঙ্ক পদ্ধতিটি চালিত করতে পারেন Task.Run। এই পদ্ধতির MyAsyncMethodসমাপ্ত হওয়া পর্যন্ত অপেক্ষা করা হবে ।

public string GetStringData()
{
    Task.Run(()=> MyAsyncMethod()).Result;
    return "hello world";
}

awaitঅবিচ্ছিন্নভাবে Resultআপনার টাস্কটি আন-আপ করে দেয় , যেখানে টাস্কটি শেষ না হওয়া পর্যন্ত রেজাল্ট ব্যবহার করা বন্ধ হয়ে যায়।


-1

সাধারণত অ্যাসিঙ্ক পদ্ধতিটি টাস্ক ক্লাস প্রদান করে। আপনি যদি Wait()পদ্ধতি বা Resultসম্পত্তি এবং কোডটি ব্যতিক্রম ছুঁড়ে মারেন - ব্যতিক্রমের ধরণটি গুটিয়ে যায় AggregateException- তবে Exception.InnerExceptionসঠিক ব্যতিক্রম সনাক্ত করতে আপনাকে জিজ্ঞাসা করতে হবে।

তবে এর .GetAwaiter().GetResult()পরিবর্তে এটি ব্যবহার করাও সম্ভব - এটি অ্যাসিঙ্ক কার্যটিও অপেক্ষা করবে, তবে ব্যতিক্রমটি আবৃত করবে না।

সুতরাং এখানে সংক্ষিপ্ত উদাহরণ:

public async Task MyMethodAsync()
{
}

public string GetStringData()
{
    MyMethodAsync().GetAwaiter().GetResult();
    return "test";
}

আপনি অ্যাসিঙ্ক ফাংশন থেকে কিছু প্যারামিটার ফিরিয়ে দিতে সক্ষম হতে চান - যা Action<return type>এসিঙ্ক ফাংশনে অতিরিক্ত সরবরাহ করে অর্জন করা যেতে পারে , উদাহরণস্বরূপ:

public string GetStringData()
{
    return MyMethodWithReturnParameterAsync().GetAwaiter().GetResult();
}

public async Task<String> MyMethodWithReturnParameterAsync()
{
    return "test";
}

দয়া করে নোট করুন যে অ্যাসিঙ্ক পদ্ধতিতে সাধারণত ASyncএকই নামের সাথে সিঙ্ক ফাংশনগুলির মধ্যে সংঘর্ষ এড়াতে সক্ষম হওয়ার জন্য প্রত্যয় নামকরণ থাকে। (উদাহরণস্বরূপ FileStream.ReadAsync) - এই প্রস্তাবটি অনুসরণ করার জন্য আমার কাছে ফাংশনের নামগুলি আপডেট করা হয়েছে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.