async প্রত্যাবর্তনের কাজটির জন্য অপেক্ষা করছে


131

কেউ কি সিঙ্ক্রোনাস পদ্ধতিতে এর অর্থ বোঝাতে পারে? আমি যদি পদ্ধতিটি পরিবর্তনের চেষ্টা করি asyncতবে ভিএস এটি সম্পর্কে অভিযোগ করে।

এইটা কাজ করে:

public Task MethodName()
{
     return Task.FromResult<object>(null);
}

এটি কাজ করে না:

public async Task MethodName()
{
     return Task.FromResult<object>(null);
}

সুতরাং মূলত আমি এর সঠিক অর্থটি জানতে চাই: Task.FromResult<object>(null);


1
এছাড়াও, এমএসডিএন পড়ুন: এমএসডিএন.মাইক্রোসফটকম /en-us/library/hh194922(v=vs.110).aspx
প্যাট্রিক Hofman

@ এলবি হুম যে কাজ করে! তবে আমি যদি শুধু return;কাজও করি ...!
ডেভিড ডুরি

2
"কাজ করে না" কী কাজ করছে না তার খুব ভাল বর্ণনা সরবরাহ করে না। আপনি প্রাপ্ত ত্রুটি বার্তাটি কী?
জন কোয়ারনার

@ জোহানকোনার আমার মনে হয় যে এটি একটি স্পষ্টতই স্পষ্ট যে সংকলকটি আপনাকে একই ত্রুটি দিতে পারে যেন আপনি কোনও voidফাংশনে কোনও মান ফেরত দেওয়ার চেষ্টা করেছিলেন ।
বিনকি 21

উত্তর:


236

asyncপদ্ধতিগুলি সাধারণ পদ্ধতির চেয়ে আলাদা। আপনি asyncপদ্ধতি থেকে যাই ফিরে আসুন তা একটি মোড়ানো হয় Task

আপনি যদি কোনও মান (অকার্যকর) ফেরত না দেন তবে এটি মুড়ে ফেলা হবে Task, আপনি যদি ফিরে যান তবে intএটি মোড়ানো হবে Task<int>এবং এ জাতীয় কিছু।

আপনার অ্যাসিঙ্ক পদ্ধতিটি যদি ফেরতের প্রয়োজন হয় তবে intআপনি পদ্ধতির রিটার্নের ধরণটি চিহ্নিত করুন Task<int>এবং আপনি সরল অবস্থায় ফিরে আসবেন intনা Task<int>। সংকলকটি intআপনার Task<int>জন্য রূপান্তর করবে ।

private async Task<int> MethodName()
{
    await SomethingAsync();
    return 42;//Note we return int not Task<int> and that compiles
}

একইভাবে, আপনি যখন ফিরে আসবেন তখন Task<object>আপনার পদ্ধতির রিটার্ন টাইপ হওয়া উচিতTask<Task<object>>

public async Task<Task<object>> MethodName()
{
     return Task.FromResult<object>(null);//This will compile
}

যেহেতু আপনার পদ্ধতিটি ফিরছে Task, সুতরাং এটির কোনও মান ফেরানো উচিত নয়। অন্যথায় এটি সংকলন করবে না।

public async Task MethodName()
{
     return;//This should work but return is redundant and also method is useless.
}

মনে রাখবেন যে awaitবিবৃতি ব্যতীত অ্যাসিঙ্ক পদ্ধতিটি নয় async


1
আমার কাছে এই রিটার্ন টাইপ কাজ করে না (আমি অনুমান করি যে আমি কিছু ভুল করছি)। স্ট্যাটিক অ্যাসিঙ্ক টাস্কের উদাহরণ <স্ট্রিং> ডু স্টাফ () {... = সামথথ অ্যাসেন্স () অপেক্ষা করুন; "স্ট্রিং মান" প্রদান; } .. var x = ডোস্টফ (); তবে এই এক্স - টাইপ "টাস্ক <স্ট্রিং>" টাইপ সহ, "স্ট্রিং" টাইপের সাথে নয় ... কেন এটি এমন?
প্রোকুরার্স

3
@ প্রাক্তনদের আপনারও অপেক্ষা করা দরকার DoStuff()। উদাহরণস্বরূপ:var x = await DoStuff();
শ্রীরাম সাক্তিভেল

5
হওয়া উচিতreturn await Task.FromResult<object>(null);
সন্দীপ তালহাথুল

@ সন্দীপতলাথুলা যে নাল ফেরার সমান
শ্রীরাম সাখাটিভেল ২

2
@ প্রফকে Task.WhenAnyএকটি উদাহরণ।
পরিবেশন করুন

55

অ্যাসিঙ্ক ব্যবহার করার সময় আপনাকে অপেক্ষা করা কীওয়ার্ডটি ব্যবহার করতে হবে এবং আপনার ফাংশন রিটার্ন টাইপটি জেনারিক হওয়া উচিত এখানে রিটার্ন মান সহ একটি উদাহরণ রয়েছে:

public async Task<object> MethodName()
{
    return await Task.FromResult<object>(null);
}

এখানে কোনও প্রত্যাবর্তন মূল্যের উদাহরণ নেই:

public async Task MethodName()
{
    await Task.CompletedTask;
}

এগুলো পড়াে:

টিপিএল: http://msdn.microsoft.com/en-us/library/dd460717(v=vs.110).aspx এবং কার্যসমূহ: http://msdn.microsoft.com/en-us/library/system.threading .tasks (উ = vs.110) .aspx

অ্যাসিঙ্ক: http://msdn.microsoft.com/en-us/library/hh156513.aspx অপেক্ষা: http://msdn.microsoft.com/en-us/library/hh156528.aspx


9
nullডামি টাস্কটির অপেক্ষা না করে আপনি সরাসরি ফিরতে পারবেন ।
লি

5
@ লাই, তবে আপনি যদি এটি করেন তবে সংকলক অভিযোগ করে (একটি সতর্কতা দেয়) যে asyncপদ্ধতিটিতে awaitকোথাও কীওয়ার্ডটি ব্যবহার করার পরামর্শ দিয়ে পদ্ধতিটি অযৌক্তিকভাবে কার্যকর করা হবে । আমি কম্পাইলার সতর্কতার শব্দটি কমাতে কেবল কীওয়ার্ডটি ব্যবহার return Task.FromResult((object)null);এবং সরিয়ে দেওয়ার পরামর্শ দিচ্ছি async
বিনকি 21

হ্যাঁ, আমি কেবল returnএকটি টাস্কে ব্যবহার করার চেষ্টা করেছি , তবে টাস্কটি কার্যকর করা অব্যাহত রাখে, কারণ returnকোনও ফেরত দিচ্ছে নাTask
টার্নার বাস

30

অ্যাসিঙ্ক কীওয়ার্ড যুক্ত করা একটি রাষ্ট্রীয় মেশিন তৈরির সহজতর করার জন্য কেবল সিনট্যাকটিক চিনি। সংক্ষেপে, সংকলকটি আপনার কোড নেয়;

public async Task MethodName()
{
     return null;
}

এবং এটিকে পরিণত করে;

public Task MethodName()
{
     return Task.FromResult<object>(null);
}

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

যখন সেই কাজটি শেষ হয়, আপনার কাজটি আবার কার্যকর করা হবে। ভেরিয়েবলের অবস্থা পুনরুদ্ধার করার জন্য পদ্ধতির শীর্ষে কিছু অতিরিক্ত কোড যুক্ত করা হয় এবং আপনার কোডের পরবর্তী স্ল্যাবে ঝাঁপিয়ে পড়ে।

দেখুন async কি উত্পন্ন করার জন্য অপেক্ষা করছে? একটি দুরন্ত উদাহরণ জন্য।

সংকলক ফলন বিবরণের সাথে পুনরুক্তি পদ্ধতিগুলি পরিচালনা করার পদ্ধতিতে এই প্রক্রিয়াটির অনেক মিল রয়েছে।


2

এটি এমন একটি টাস্ক যা স্ট্রিংয়ের একটি টাস্ক ফিরিয়ে দেয় (সি # বেনামে ফাংশন বা অন্য কথায় একটি প্রতিনিধি 'ফানক' ব্যবহৃত হয়)

    public static async Task<string> MyTask()
    {
        //C# anonymous AsyncTask
        return await Task.FromResult<string>(((Func<string>)(() =>
        {
            // your code here
            return  "string result here";

        }))());
    }

1
উত্তর হিসাবে কোড পোস্ট করার সময়, আপনি কী প্রদর্শন করছেন তার কিছু ব্যাখ্যা অন্তর্ভুক্ত করুন। এই ক্ষেত্রে, আপনি একটি পুরানো প্রশ্নের উত্তর যুক্ত করছেন যা ইতিমধ্যে বেশ কয়েকটি উত্তর রয়েছে। আপনার নতুন উত্তরটি কী প্রদর্শিত হচ্ছে তা বর্ণনা করে দয়া করে একটি বা দুটি বাক্য যুক্ত করুন, যা অন্য উত্তরে ইতিমধ্যে প্রদর্শিত হয়নি। আমি আপনার উত্তরের সাথে কিছু ভুল বলে দিচ্ছি না, কেবল আপনার কোড দিয়ে আপনি যা দেখিয়ে দিচ্ছেন তা শব্দ দিয়ে অন্যকে সহায়তা করার জন্য বলছি that
নির্মাতা স্টিভ

0

অ্যাসিঙ্ক পদ্ধতিগুলি থেকে যথাযথ প্রতিক্রিয়াগুলি ফিরে পেতে, এই টাস্ক পদ্ধতিগুলিকে কল করার সময় আপনাকে অপেক্ষা করতে হবে। এটি এটিকে প্রত্যাবর্তিত মান ধরণের পরিবর্তে টাস্কের ধরণে রূপান্তর করার জন্য অপেক্ষা করবে।

উদাহরণস্বরূপ বিষয়বস্তু = স্ট্রিংএসিঙ্কটাস্কের জন্য অপেক্ষা (

যেখানে পাবলিক অ্যাসিঙ্ক টাস্ক < স্ট্রিং > স্ট্রিংঅ্যাসেন্সটাস্ক ()

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