একটি সম্পূর্ণ টাস্ক তৈরি করুন


197

আমি একটি সম্পূর্ণ Task(না Task<T>) তৈরি করতে চাই । এটি করার জন্য। নেট মধ্যে কিছু অন্তর্নির্মিত আছে?

সম্পর্কিত সম্পর্কিত প্রশ্ন: একটি সম্পূর্ণ টাস্ক তৈরি করুন <টি>


2
It seems like the answer I'm getting from everyone is that using a garbage value like this is the correct way. That there isn't a way to do this without the garbage value is disappointing -- oh well.আপনি কি মনে করেন এটিতে কোন সমস্যা রয়েছে? আপনি যদি এককটিকে ক্যাশে করেন Taskতবে আপনার পুরো প্রোগ্রামটি অতিরিক্ত এক বিট মেমরি গ্রহণ করে। এটা কিছুই । এছাড়াও, কেউ এটি না করে একটি সম্পূর্ণ কাজ তৈরি করতে পারে, এটি আরও ভাল কিছু হবে না।
পরিবেশন করুন

10
ওহ আমার হতাশার অতিরিক্ত মেমরি ব্যবহার করার সাথে কিছুই করার নেই। এটি ঠিক যে কোডের যে কোনও জায়গায় আবর্জনার মান মার্জিত নয়।
তীমথিয় শিল্ডস

1
মনে রাখবেন যে আজ ValueTaskসম্পন্ন কাজের জন্য রয়েছে (যেমন আপনার কাছে ইতিমধ্যে মূল্যবোধগুলির জন্য তাই কোডটি মূলত সিঙ্ক্রোনাস), যা আপনাকে একটি বরাদ্দ বাঁচাতে পারে।
নওফাল

উত্তর:


246

। নেট (v4.6) এর নতুন সংস্করণটি কেবল এটি যুক্ত করছে, একটি বিল্ট-ইন টাস্ককমপ্লিটড টাস্ক :

Task completedTask = Task.CompletedTask;

এই সম্পত্তিটি একটি নো-লক সিঙ্গলটন হিসাবে প্রয়োগ করা হয়েছে যাতে আপনি প্রায় সর্বদা একই সমাপ্ত টাস্কটি ব্যবহার করেন।


1
সবেমাত্র সর্বশেষতম ভিএস 14 সিটিপি পরীক্ষা করে একটি 4.5.4 প্রকল্প তৈরি করেছে, Task.CompletedTaskএটি এখনও অভ্যন্তরীণ।
পিটার রিচি

1
২) হয় আপনি সর্বশেষতম সিটিপি ডাউনলোড করেন নি (যা 4 এবং সেই সাইট থেকে লিঙ্কযুক্ত) অথবা আপনি সংস্করণ 4.5.3 নির্দিষ্ট করেন নি। আমার মেশিনে যা আছে তা এখানে । @ পিটাররিচি
i3arnon

আমি আজুরের ভিজ্যুয়াল স্টুডিও 14 চিত্র থেকে একটি ভিএম তৈরি করেছি।
পিটার রিচি 18

1
@ পিটাররিচি অ্যাজুর
ভিএস

আমি মোনো ওএস এক্সে মনো 5.4.1.7 নিয়ে কাজ করছি এবং আমি এই একই ত্রুটি পেয়েছি। আমি এটা কিভাবে ঠিক করবো?
খালেদ আন্নাজার

152

Task<T>স্পষ্টত রূপান্তরযোগ্য Task, সুতরাং কেবল একটি সম্পূর্ণ Task<T>(কোনও Tএবং কোনও মান সহ) পান এবং এটি ব্যবহার করুন। সত্যিকারের ফলাফলটি কোথাও রয়েছে এমন তথ্যটি গোপন করতে আপনি এই জাতীয় কিছু ব্যবহার করতে পারেন।

private static Task completedTask = Task.FromResult(false);
public static Task CompletedTask()
{
    return completedTask;
}

মনে রাখবেন যেহেতু আমরা ফলাফলটি প্রকাশ করছি না, এবং কার্যটি সর্বদা সম্পন্ন হয়, তাই আমরা একক টাস্ককে ক্যাশে রাখতে পারি এবং এটি পুনরায় ব্যবহার করতে পারি।

আপনি যদি নেট নেট using.০ ব্যবহার করছেন এবং তা না থাকলে আপনি এটি ব্যবহার FromResultকরে নিজের তৈরি করতে পারেন TaskCompletionSource:

public static Task<T> FromResult<T>(T value)
{
    var tcs = new TaskCompletionSource<T>();
    tcs.SetResult(value);
    return tcs.Task;
}

8
আপনি যদি using.০ ব্যবহার করে থাকেন তবে টাস্কএক্স.ফর্মআরসাল্ট পেতে মাইক্রোসফ্ট.বিসিএল.এন্সিঙ্ক লাইব্রেরি যুক্ত করতে পারেন, পাশাপাশি হ্যাভএল
কার্ল


3
@FrancescoB। যদি আপনি কখনও ফলাফলটি দেখেন, তবে এটি ফলাফলের বুলিয়ান মান পরিবর্তন করে। যদি আপনি ফলাফলটিকে উপেক্ষা করছেন, তবে ফলাফলটি কী অপ্রাসঙ্গিক।
পরিবেশন করুন

66

এটি করার জন্য আমার পছন্দসই পদ্ধতিটি Task.WhenAll()কোনও যুক্তি ছাড়াই কল করা। MSDN ডকুমেন্টেশন রাজ্যের যে "সরবরাহকৃত অ্যারের / গণনীয় কোন কর্ম থাকে, ফিরে টাস্ক আগেই আহ্বানকারী ফিরে হচ্ছে অবিলম্বে RanToCompletion অবস্থায় রূপান্তর হবে।"। আপনি যা চান তা শোনাচ্ছে।

আপডেট: আমি উত্সটি মাইক্রোসফ্টের রেফারেন্স উত্সে পেয়েছি ; সেখানে আপনি দেখতে পাচ্ছেন যে টাস্ক.সেই সমস্তটিতে নিম্নলিখিত রয়েছে:

return (tasks.Length == 0) ? // take shortcut if there are no tasks upon which to wait
            Task.CompletedTask :
            new WhenAllPromise(tasks);

সুতরাং Task.CompletedTask প্রকৃতপক্ষে অভ্যন্তরীণ, তবে এটি কোনও আর্গুমেন্ট ছাড়াই হ্যাভএল () কে কল করে প্রকাশ করা হয়েছে।


9
যদিও এটি একধরনের হ্যাকি অনুভব করে, ডক্সের এটির সমর্থন রয়েছে, তাই আমি জানি না, আমি এটি পছন্দ করি!
সারা

2
আমার এবং আমার .NET 4.5.2 কোডটি সীমিত কোডের জন্য এটি যথেষ্ট মার্জিত। ধন্যবাদ!
স্টাস ইভানভ

36

আমি ব্যবহার করব Task.Delay(0)। অভ্যন্তরীণভাবে, এটি একটি সমাপ্তের একটি ক্যাশেড উদাহরণ প্রদান করে Task<T>। এটি হ'ল বর্তমান উত্তর যেভাবেই করুক তা বোঝায়, কেবল এখন আপনাকে নিজেরাই একটি নজরে ক্যাশে করতে হবে না বা আপনার কোডে কোনও অব্যর্থ আবর্জনার মানও নেই।

আপনি চিন্তা আপনি ব্যবহার করতে পারেন হতে পারে Task.Yield()পরিবর্তে, কিন্তু এটা ফলাফলের সক্রিয় আউট Task.Yield()হয় না একটি উপপ্রকার Task, ফল যেহেতু Task.Delay(0)নেই। এটি উভয়ের মধ্যে একটি সূক্ষ্ম পার্থক্য।


30

আপনি একটি সম্পূর্ণ ফিরে আসতে Task.FromResult (.NET 4.5 এ) ব্যবহার করতে পারেন Task<T>

আপনার যদি একটি জেনেরিক প্রয়োজন হয় তবে আপনি Taskসর্বদা ব্যবহার করতে পারেন Task.FromResult(0)বা অনুরূপ ব্যবহার করতে পারেন , যেহেতু Task<T>একটি সাবক্লাস Task


11

নেট 4.6 এবং উপরের ব্যবহারের জন্য

return Task.CompletedTask;

নিম্ন সংস্করণ জন্য আপনি ব্যবহার করতে পারেন

return new Task(() => { });

3
প্রাক 4.6 পদ্ধতির জন্য, সাবধান! আপনার কাজটি শুরু করতে হবে বা এটি কখনই শেষ হবে না! return Task.Delay(0);পরিবর্তে ব্যবহার সম্পর্কে ?
মিকেল

8

আপনি স্টিফেন ক্লিয়ারি থেকে একটি দুর্দান্ত গ্রন্থাগার AsyncEx থেকে প্রস্তুত নিতো.এন্সিএক্সএক্স.টাসক কনস্ট্যান্টস ব্যবহার করতে পারেন ।


নিতো.এএনসিএনএক্স.টাসক কনস্ট্যান্টস-লিঙ্ক-সমাপ্ত উত্স ফাইলটি মারা গেছে
harlam357

@ harlam357 স্থির হয়েছে।
আলেকজান্ডার লগার

0

কেমন:

#pragma warning disable 1998
    public async Task emptyTask() {
    }
#pragma warning restore 1998

আপনি যদি মনে না করেন তবে সতর্কতা দমনটি ছেড়ে দিতে পারেন।


আমি বিশ্বাস করি যে কোনও পদ্ধতি চিহ্নিত asyncকরে এখনও এটি ব্যবহার না করা সত্ত্বেও পুরো রাজ্য মেশিন যন্ত্রপাতি তৈরি করে, তাই খালি টাস্কটি ফিরিয়ে দেওয়া স্বল্প-সংস্থান পরিস্থিতিগুলির জন্য আরও কার্যকর।
ক্যালভিন ফিশার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.