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


125

আমি একটি পদ্ধতি বাস্তবায়ন করছি Task<Result> StartSomeTask()এবং পদ্ধতিটি বলার আগেই ফলাফলটি জানতে পেরেছি। ইতিমধ্যে সম্পন্ন একটি টাস্ক <টি> আমি কীভাবে তৈরি করব ?

আমি বর্তমানে এটি করছি:

private readonly Result theResult = new Result();

public override Task<Result> StartSomeTask()
{
    var task = new Task<Result>(() => theResult);
    task.RunSynchronously(CurrentThreadTaskScheduler.CurrentThread);
    return task;
}

এর চেয়ে ভাল সমাধান কি আছে?


6
দ্রষ্টব্য, এই প্রশ্নের উত্তরগুলি প্লেইন টাস্ক তৈরি করার জন্য ঠিক কাজ করে (কোনও <টি> নয়) কারণ টাস্ক <টি> টাস্ক থেকে উত্তরাধিকার সূত্রে প্রাপ্ত।
টিম লাভল-স্মিথ

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

উত্তর:


111
private readonly Result theResult = new Result();

public override Task<Result> StartSomeTask()
{
    var taskSource = new TaskCompletionSource<Result>();
    taskSource.SetResult(theResult);
    return taskSource.Task;
}

@ ড্যানিয়েললোবো আপনার আপত্তি কী তা ব্যাখ্যা করলে আপনি একটি উত্তর পেতে পারেন
ব্যবহারকারী 2023861

1
সরল এবং আরও অনেক বেশি ভোট দিয়ে নীচের অংশে এটি কী হওয়া উচিত নয়? @ ব্যবহারকারী2023861
ড্যানিয়েল লোবো

203

.NET 4.5 টার্গেট করার সময় আপনি ব্যবহার করতে পারেন Task.FromResult:

public static Task<TResult> FromResult<TResult>(TResult result);

একটি ব্যর্থ টাস্ক তৈরি করতে, ব্যবহার করুন Task.FromException:

public static Task FromException(Exception exception);
public static Task<TResult> FromException<TResult>(Exception exception);

আপনার জেনেরিকের Task.CompletedTaskপ্রয়োজন হলে নেট 4.6 যোগ করে Task

public static Task CompletedTask { get; }

.NET- র পুরানো সংস্করণগুলির জন্য কার্যপত্রক

  • Async টার্গেটিং প্যাক (বা AsyncCTP) দিয়ে .NET 4.0 টার্গেট করার সময় আপনি এর TaskEx.FromResultপরিবর্তে ব্যবহার করতে পারেন ।

  • অ জেনেরিক পেতে Task.NET 4.6 এর আগে আপনি যে ব্যবহার করতে পারেন Task<T>থেকে আহরিত Taskএবং মাত্র কল Task.FromResult<object>(null)বা Task.FromResult(0)


13
জেনেরিক কোনও টাস্ক ফিরিয়ে আনার জন্য, Task.FromResult (0) এর মতো কিছু ব্যবহার করা ভাল। "নাল" প্যারামিটার হিসাবে ব্যবহার করা কম্পাইলারকে বিভ্রান্ত করতে পারে যা জেনেরিক প্যারামিটার নির্ধারণ করতে পারে না।
হোয়ালি

ব্যতিক্রম সম্পর্কে কি? অ্যাসিঙ্ক পদ্ধতিগুলি রাষ্ট্রীয় মেশিনে সংকলিত হয় যা ব্যতিক্রমগুলি ধরে এবং ফিরে টাস্কে সেভ করে। কোডটি আগে অপেক্ষা করার আগে কার্যকর করার জন্যও এটি ঘটে। টাস্ক ফিরিয়ে দেওয়ার পদ্ধতি romফরমে রেজাল্ট থেকে সরাসরি ব্যতিক্রম ছুঁড়ে ফেলা হতে পারে।
রবার্ট ভান

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

1
@ রবার্টভ্যান আপনি সহজেই নিজের FromExceptionপদ্ধতি লিখতে পারেন , এটি এর মতো আচরণ করে FromResultতবে পরিবর্তে একটি ত্রুটিযুক্ত কার্যকে উপস্থাপন করে। এই জাতীয় পদ্ধতিটি তার ত্রুটির ক্ষেত্রে সহজেই এটি ফিরিয়ে দিতে পারে যদি ফলস্বরূপ কার্যটিতে ব্যতিক্রম উপস্থাপন করা গুরুত্বপূর্ণ important
21:25:25

1
Task.FromException .NET 4.5 এ উপলব্ধ নেই ... আমি মনে করি এটি নির্দিষ্ট করা উচিত।
স্টিলিটিটি

12

কোনও রিটার্ন মান না দিয়ে কর্মের জন্য .NET 4.6 যোগ করেছে Task.CompletedTask

এটি ইতিমধ্যে টাস্কস্ট্যাটাসে থাকা একটি টাস্ককে ফেরত দেয় anরানটোকম্প্লেশন। এটি প্রতিবার সম্ভবত একই উদাহরণটি ফিরে আসে, তবে ডকুমেন্টেশন আপনাকে সেই সত্যটি বিবেচনা না করার জন্য সতর্ক করে দেয়।


1

আপনি যদি আরএক্স ব্যবহার করছেন তবে বিকল্পটি পর্যবেক্ষণযোগ্য et রিটার্ন (ফলাফল) o টোটাস্ক ()।


1

কোনও পরামিতি ছাড়াই টাস্ককে ডেকে পাঠানো।

Task task = Task.WhenAll();

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