অ্যাসিঙ্ক এবং অপেক্ষা - বিকল্পগুলির জন্য পোল [বন্ধ]


15

এখন আমরা কি জানেন যে # 5 গ জন্য দোকান, সেখানে দৃশ্যত এখনও আমাদের 'এর জন্য দুটি নতুন কীওয়ার্ড পছন্দ প্রভাবিত করার জন্য একটি খোলার হয় Asynchrony ' যে গতকাল অ্যান্ডার্স Heijsberg দ্বারা ঘোষণা করা হয় PDC10

async void ArchiveDocuments(List<Url> urls) {
    Task archive = null;
    for(int i = 0; i < urls.Count; ++i) {
        var document = await FetchAsync(urls[i]);
        if (archive != null)
            await archive;
        archive = ArchiveAsync(document);
    }
}

এরিক লিপার্টের বর্তমান দুটি কীওয়ার্ডের পছন্দ এবং ব্যবহারের অধ্যয়নের ক্ষেত্রে যেভাবে তাদের ভুল বোঝাবুঝি করা হয়েছে তার ব্যাখ্যা রয়েছে has মন্তব্যে আরও কয়েকটি প্রস্তাব রয়েছে।

দয়া করে - প্রতি উত্তরে একটি পরামর্শ, সদৃশগুলি নোট করা হবে।


যেভাবে "ভাষা-সংহত অ্যাসিনক্রোনাস প্রোগ্রামিং" আমাদেরকে এলআইএপি দেয়, লিনক-এর মতো জিহ্বাকে পুরোপুরি ঘুরিয়ে দেয় না;)
বেনজল

1
যতক্ষণ না এর উচ্চারিত ঝাপটা।
কনরাড ফ্রিক্স

3
তবে "ভাষা-সমন্বিত অ্যাসিনক্রোনাস রানটাইম" সংক্ষিপ্ত বিবরণটি সুন্দরভাবে আপ করা হয়েছে।
glenatron

এটি অফ-টপিক হতে পারে।
ডেডএমজি

উত্তর:


6

প্রদত্ত যে আমি এর অর্থ / প্রয়োজনীয়তা সম্পর্কে পরিষ্কার নই async, আমি এটির সাথে সত্যই তর্ক করতে পারি না, তবে প্রতিস্থাপনের জন্য আমার সেরা পরামর্শটি awaitহ'ল:

yield while (দেখুন! কোনও নতুন কীওয়ার্ড নেই)

নোটটি এই সম্পর্কে আরও কিছুটা ভাবার পরে, আমি ভাবছি যে whileএইভাবে পুনরায় ব্যবহার করা ভাল ধারণা কিনা - প্রাকৃতিক প্রবণতাটি পরে বুলিয়ান আশা করা যায় expect

(ভাবেন: ভাল কীওয়ার্ড সন্ধান করা ভাল ডোমেন নামগুলি সন্ধান করার মতো :)


+1 এবং যাইহোক, আপনি তার ব্লগ এন্ট্রিতে 7 মিনিটের মধ্যে মন্তব্য করতে আমাকে মারধর করেছেন ...
নিজের কাছে নোট করুন - একটি নাম 21

তবে যদি কাজটি ইতিমধ্যে সম্পন্ন হয়ে যায় তবে আপনি অগত্যা মৃত্যুদন্ড কার্যকর করবেন না। তবে আপনি সর্বদা কার্য সমাপ্তির অপেক্ষায় রয়েছেন (যদিও কখনও অপেক্ষা করেননি)।
অ্যালন গুরালেনেক

@ অ্যালন আপনি অগত্যা দুজনের লুপ বডি চালাবেন না while(x) {...}, যদি xএটি মিথ্যা হয়।
নিজের কাছে দ্রষ্টব্য -

@ দ্রষ্টব্য: ভাল কোন ক্রিয়া আছে while। যদি আপনি কোনও ক্রিয়া যুক্ত করেন, যেমন do, তবে আপনি পাবেন do {...} while (x)যা এক্সকে নির্বিশেষে শরীরের নির্বাহ করে (অন্তত একবার)। আপনার পরামর্শটি এর সাথে yield whileসাদৃশ্যপূর্ণ বলে মনে হচ্ছে do whileতবে ক্রিয়াটি সম্পাদন করার বিপরীত গ্যারান্টি সহ, যা কিছুটা বিভ্রান্তিকর হতে পারে (তবে এটি কোনও বড় বিষয় নয়)। আমি yieldযে বিষয়টি সম্পর্কে সবচেয়ে বেশি অপছন্দ করি তা হ'ল এটি কোনও প্রক্রিয়াটির বাস্তবায়নকে বোঝায়। async/ এর পুরো বিষয়টি awaitহ'ল আপনি একটি সিঙ্ক্রোনাস স্টাইলে একটি অ্যাসিনক্রোনাস অপারেশন লেখেন। yieldযে সিঙ্ক্রোনাস স্টাইল বিরতি।
অ্যালন গুরালেনেক

একটি নতুন কীওয়ার্ডটি কী অগত্যা খারাপ জিনিস? আমি এটি বুঝতে পারি, awaitকীওয়ার্ডটি প্রসঙ্গ দ্বারা স্বীকৃত হবে, সুতরাং আপনি চাইলে "অপেক্ষা" নামে একটি পদ্ধতি বা পরিবর্তনশীল থাকতে পারে। কিছুটা হলেও, আমি মনে করি যে নতুন কার্যকারিতার জন্য একটি নতুন কীওয়ার্ড ব্যবহার করা বিদ্যমান কীওয়ার্ডকে একাধিক জিনিস বোঝাতে পুনরায় ব্যবহার করার চেয়ে কম বিভ্রান্তিকর। (অতিরঞ্জিত উদাহরণ: বিপদগ্রাহক.না. / এসোটেরিক / কুকটি এইচটিএমএল )
টিম গুডম্যান

5

কীওয়ার্ড না থাকা সম্পর্কে কীভাবে?

আমি সংকলকটি বুঝতে পারি যে বেশিরভাগ সময় আমি যখন অ্যাসিক্রোনাস পদ্ধতিতে কল করি তখন আমি এর ফলাফল চাই want

Document doc = DownloadDocumentAsync();

এটাই. এই জিনিসটির জন্য কীওয়ার্ডটি ভাবার জন্য লোকেরা যেভাবে কঠিন সময় কাটাচ্ছে তা হ'ল কারণ "জিনিসগুলি পুরোপুরি স্বাভাবিক থাকলে আপনি যে কাজটি করতেন তা কর" এর মতো একটি কীওয়ার্ড থাকার মতো। এটি ডিফল্ট হওয়া উচিত, কোনও কীওয়ার্ডের প্রয়োজন নেই।

হালনাগাদ

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

আমরা একটি বৈশিষ্ট্য উদ্ভাবিত: [AutoAwait]। এটি কেবল পদ্ধতিতে প্রয়োগ করা যেতে পারে। আপনার পদ্ধতিতে এটি প্রয়োগ করার একটি উপায় হ'ল এটি চিহ্নিত করা async। তবে আপনি এটি হাতে করেও করতে পারেন, যেমন:

[AutoAwait]
public Task<Document> DownloadDocumentAsync()

তারপরে যে কোনও asyncপদ্ধতির ভিতরেই , সংকলকটি ধরে নেবে যে আপনি কোনও কলটিতে অপেক্ষা করতে চান DownloadDocumentAsync, তাই আপনাকে এটি নির্দিষ্ট করার দরকার নেই। এই পদ্ধতিতে যে কোনও কল স্বয়ংক্রিয়ভাবে এটির জন্য অপেক্ষা করবে।

Document doc = DownloadDocumentAsync();

এখন, আপনি যদি "চালাকি পেতে" এবং এটি পেতে চান Task<Document>, আপনি একটি অপারেটর ব্যবহার করেন start, যা কেবল কোনও পদ্ধতি কলের আগে উপস্থিত হতে পারে:

Task<Document> task = start DownloadDocumentAsync();

ঝরঝরে, আমি ভাবি। এখন একটি সরল পদ্ধতি কলটির অর্থ সাধারণত যা বোঝায়: পদ্ধতিটি সম্পূর্ণ হওয়ার জন্য অপেক্ষা করুন। এবং startআলাদা কিছু নির্দেশ করে: অপেক্ষা করবেন না।

কোনও asyncপদ্ধতির বাইরে উপস্থিত কোডের জন্য , আপনাকে কোনও [AutoAwait]পদ্ধতিতে কল করার অনুমতি দেওয়া হচ্ছে কেবলমাত্র এটির সাথে উপসর্গ করে start। এটি আপনাকে কোড লিখতে বাধ্য করে যা কোনও asyncপদ্ধতিতে প্রদর্শিত হয় কিনা তা নির্বিশেষে একই অর্থ রয়েছে has

তারপরে আমি লোভ পেতে শুরু করি! :)

প্রথমত, আমি asyncইন্টারফেস পদ্ধতিতে প্রয়োগ করতে চাই :

interface IThing
{
    async int GetCount();
} 

মূলত এর অর্থ হ'ল বাস্তবায়ন পদ্ধতিটি অবশ্যই ফিরে আসবে Task<int>বা এর সাথে সামঞ্জস্যপূর্ণ কিছু awaitহবে এবং পদ্ধতিতে কলকারীরা [AutoAwait]আচরণ পাবেন।

এছাড়াও আমি যখন উপরের পদ্ধতিটি প্রয়োগ করি তখন আমি লিখতে সক্ষম হতে চাই:

async int GetCount()

সুতরাং আমি Task<int>রিটার্ন টাইপ হিসাবে উল্লেখ করতে হবে না ।

এছাড়াও, আমি asyncপ্রতিনিধি প্রকারগুলিতে প্রয়োগ করতে চাই (যা সর্বোপরি একটি পদ্ধতির ইন্টারফেসের মতো)। তাই:

public async delegate TResult AsyncFunc<TResult>();

একজন asyncপ্রতিনিধি আছে - আপনি এটি অনুমান করেছেন - [AutoAwait]আচরণ। একটি asyncপদ্ধতি থেকে আপনি এটিকে কল করতে পারেন এবং এটি স্বয়ংক্রিয়ভাবে awaitএড হয়ে যাবে (যদি না আপনি কেবল startএটি চয়ন করেন)। এবং তাই যদি আপনি বলেন:

AsyncFunc<Document> getDoc = DownloadDocumentAsync;

এটা ঠিক কাজ করে। এটি কোনও মেথড কল নয়। কোনও কাজ এখনও শুরু করা হয়নি - এটি কোনও কাজ async delegateনয়। এটি কাজ করার জন্য একটি কারখানা। তুমি বলতে পারো:

Document doc = getDoc();

এবং এটি কোনও কাজ শুরু করবে এবং এটি শেষ হওয়ার জন্য অপেক্ষা করবে এবং আপনাকে ফলাফল দেবে। অথবা আপনি বলতে পারেন:

Task<Document> t = start getDoc();

সুতরাং এর মধ্যে একটি জায়গা যেখানে "নদীর গভীরতানির্ণয়" ফাঁস হয় তা হল আপনি যদি কোনও asyncপদ্ধতিতে প্রতিনিধি বানাতে চান তবে আপনাকে কোনও async delegateপ্রকারটি ব্যবহার করতে হবে তা জানতে হবে । তার পরিবর্তে Funcআপনার অবশ্যই বলতে হবে AsyncFunc, ইত্যাদি on যদিও একদিন সেই ধরণের জিনিসটি উন্নত প্রকারের অনুক্রমের মাধ্যমে স্থির করা যেতে পারে।

আর একটি প্রশ্ন হ'ল যদি আপনি কোনও সাধারণ (অ-অ্যাসিঙ্ক) পদ্ধতিতে শুরু করেন তবে কি হবে। অবশ্যই একটি সংকলন ত্রুটি হবে নিরাপদ বিকল্প। তবে অন্যান্য সম্ভাবনাও রয়েছে।


এটি অন্তর্নিহিত রূপান্তরের মাধ্যমে কার্যকর হতে পারে তবে অন্যথায় বিবৃতিটির বাম থেকে ডান মূল্যায়ন প্রয়োজন (যা ল্যাম্বডাস বাদে সংকলক সাধারণত কীভাবে কাজ করে তার ঠিক বিপরীত)। আমি মনে করি আমি এখনও এর বিপক্ষে থাকব কারণ এটি varসম্ভাব্যভাবে কিছু দীর্ঘ স্পষ্ট টাইপ নামের বিকল্প ব্যবহার করতে বাধা দেয় এবং awaitকেস এবং মামলার ক্ষেত্রেও দ্বিধাগ্রস্ত, যেখানে ঘটনাক্রমে কেউ সাধারণ সিনক্রোনাস পদ্ধতির পরিবর্তে অ্যাসিঙ্ক পদ্ধতিটি বলে। এটি প্রথমে স্বজ্ঞাত মনে হলেও আসলে কমপক্ষে অবাক করার নীতিটি লঙ্ঘন করে।
অ্যারোনআউট

@ অ্যারোনট - কেন এটি ব্যবহার প্রতিরোধ করে var? আমি অবাক হয়েছি আপনি যদি আমার উত্তরটির পূর্ববর্তী সংশোধনীতে সাড়া দিচ্ছেন ... আমি একেবারে নতুন করে লিখেছি। আপনি এখন এই পরামর্শটি নিম্নরূপে ভাবতে পারেন: পদ্ধতিটি যদি একটি বিশেষ বৈশিষ্ট্যের সাথে চিহ্নিত করা হয়, তবে মনে হয় awaitকীওয়ার্ডটি স্বয়ংক্রিয়ভাবে সেই পদ্ধতিতে কলগুলির সামনে (োকানো হয় (যদি আপনি এটি startউপসর্গ দিয়ে দমন না করেন )। সবকিছু সিটিপির মতো ঠিক থাকে, এবং তাই এটি দুর্দান্ত varকাজ করে।
ড্যানিয়েল আরউইকার

প্রকৃতপক্ষে আমি ... অদ্ভুত ছিলাম যে আমি এই থ্রেডটি পুনর্বিবেচনা করার সিদ্ধান্ত নিয়েছি এবং আপনি যে সম্পাদনা করার সিদ্ধান্ত নিয়েছিলেন ঠিক ঠিক সেই সময়ে আপনার উত্তরটির প্রতিক্রিয়া জানাব। আমাকে এখনই এটি আবার
পড়তে

1
আমি আপনার অপেক্ষার কীওয়ার্ডটি উল্টানো পছন্দ করি। এবং আমি ট্রিপল-অপ্রয়োজনীয় অপছন্দও public async Task<int> FooAsync()
অ্যালন গুরালেনেক

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

4
hearken unto AsyncFetch(…)

(যদি আপনি এটি না পান তবে এরিকের ব্লগ এন্ট্রিটি পড়ুন least কমপক্ষে এটি এর চেয়ে ভাল for sooth Romeo wherefore art thou AsyncFetch(…))


(যাদের মজাদার অনুভূতি নেই তাদের প্রয়োগ করার প্রয়োজন নেই)
স্বতঃ দ্রষ্টব্য - একটি নাম চিন্তা করুন

4

আমি মনে করি asyncঠিক আছে, তবে এটি এএসপি.নেট অ্যাসিঙ্ক পৃষ্ঠাগুলির সাথে যুক্ত করার কারণে - একই ধারণা।

মূলশব্দটির জন্য awaitআমি পছন্দ করি continue afterবা resume after

আমি বা এর কোনও রূপ পছন্দ করি নাyield , কারণ শব্দার্থবিজ্ঞান এমন যে পদ্ধতিটি বাস্তবে কখনও মৃত্যুদন্ড কার্যকর করতে পারে না; এটি টাস্কের অবস্থার উপর নির্ভর করে।


আমি চাই resume afterজন্য await। হয়তো asyncবলা যেতে পারে resumable
টিম গুডম্যান

যদিও আমি ন্যায়সঙ্গত চাই after, continue afterপদ্ধতির একটি দৃ implementation় বাস্তবায়নের সুবিধা রয়েছে: এটিতে বর্তমানে বিদ্যমান প্রাসঙ্গিক কীওয়ার্ড অন্তর্ভুক্ত রয়েছে তবে একটি বাক্য গঠন যা বর্তমান ব্যবহারের সাথে সামঞ্জস্য নয়। এটি গ্যারান্টি দেয় যে সংযোজন কখনই বিদ্যমান কোডটি ভঙ্গ করবে না। সম্পূর্ণ নতুন কীওয়ার্ড ব্যবহার করার সময়, পুরানো কোডের শনাক্তকারী হিসাবে শব্দের সম্ভাব্য ব্যবহারগুলির সাথে বাস্তবায়নটির প্রয়োজন হয়, যা বেশ জটিল হয়ে উঠতে পারে।
এডুরন পাসকুয়াল

3

আমি এরিকের ব্লগেও মন্তব্যগুলিতে যুক্ত করেছি, একই কীওয়ার্ডটি ব্যবহার করে আমি কোনও সমস্যা দেখছি না async

var data = async DownloadFileAsync(url);

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

var data = async DownloadFile(url);

সিঙ্ক্রোনাসকে কল করার বিপরীতে

var data = DownloadFile(url);

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


আপনার যোগ করা চিনিটি আমি পছন্দ করি, যদিও সি # লোকেরা সম্ভবত এর জন্য যাবে না। (এফডাব্লুআইডাব্লু, গুণাবলীর নাম অনুসন্ধান করার সময় তারা ইতিমধ্যে কিছু অনুরূপ কাজ করেছে)
স্বতঃ দ্রষ্টব্য - একটি নাম ভেবে

2
এবং প্রদত্ত asyncপদ্ধতিটির কীওয়ার্ডটি কেবলমাত্র নব্বইয়ের (যদি আমি সঠিকভাবে বুঝতে পারি), আমি অবাক হয়েছি যে আপনি যে পরামর্শ দিচ্ছেন তার বিপরীতে সেরা জিনিসটি হবে না কিনা: asyncপদ্ধতিটি বাদ দিন এবং কেবল এটি ব্যবহার করুন যেখানে তারা বর্তমানে আছে await
বেনজল

এটা একটা সম্ভাবনা। পদ্ধতির বদ্বন্ধে অ্যাসিঙ্ক কীওয়ার্ডটি সত্যিই পরিষ্কার-পরিচ্ছন্নতার জন্য রয়েছে। আমি এটি সেখানে রাখা পছন্দ করি, তবে আমাদের প্রয়োজন ছাড়া পদ্ধতির নামগুলিতে "অ্যাসিঙ্ক" যুক্ত করা। যেমন async Task<Byte[]> DownloadFile(...)বদলে Task<Byte[]> DownloadFileAsync(...)(আধুনিক কম্পাইল স্বাক্ষর যাহাই হউক না কেন থাকবে)। যেভাবেই কাজ করে।
মার্ক এইচ

আমি সত্যিই এটিরও ভক্ত নই। পূর্ববর্তী মন্তব্যে আমাকে উল্লেখ করতে হবে যে আপনার চূড়ান্ত সংস্করণটি কমপক্ষে বিস্ময়ের নীতি লঙ্ঘন করেছে, কারণ এটি আসলে লিখিত থেকে সম্পূর্ণ ভিন্ন পদ্ধতির দিকে আহ্বান করছে এবং সেই পদ্ধতির প্রয়োগ এবং স্বাক্ষর পুরোপুরি বাস্তবায়নকারী শ্রেণীর উপর নির্ভরশীল । এমনকি প্রথম সংস্করণটি সমস্যাযুক্ত কারণ এটি সত্যিকার অর্থে কিছু বলছে না (অযৌক্তিকভাবে এই অ্যাসিঙ্ক্রোনাস পদ্ধতিটি কার্যকর করুন?)। আমরা যে ভাবনাটি প্রকাশ করার চেষ্টা করছি তা হ'ল একটি ধারাবাহিকতা বা মুলতুবি কার্যকরকরণ এবং এটি একেবারেই প্রকাশ করে না।
অ্যারোনআউট

3

async = টাস্ক - এটি কোনও টাস্ক ফিরিয়ে দেওয়ার জন্য একটি ফাংশনটি সংশোধন করছে, সুতরাং "টাস্ক" কীওয়ার্ডটি ব্যবহার করবেন না কেন?

অপেক্ষা = সমাপ্তি - আমাদের অগত্যা অপেক্ষা করার দরকার নেই, তবে ফলাফলটি ব্যবহারের আগে টাস্কটির "সমাপ্তি" করতে হবে।


এখানে সরলতার সাথে তর্ক করা সত্যিই কঠিন।
sblom

2

আমি চাই yield untilyield whileইতিমধ্যে প্রস্তাবিত, দুর্দান্ত এবং কোনও নতুন কীওয়ার্ড প্রবর্তন করে না, তবে আমি মনে করি "অবধি" আচরণটি একটু ভালভাবে ধরা দেয়।

আমি মনে করি yield <something>একটি দুর্দান্ত ধারণা, কারণ ফলন ইতিমধ্যে বাকি পদ্ধতিটিকে এত ভালভাবে চালিয়ে যাওয়ার ধারণাটি ধারণ করে। হয়তো কেউ "অবধি" এর চেয়ে ভাল শব্দটির কথা ভাবতে পারে।


2

আমি কেবল অ্যারন জি-এর পরামর্শের জন্য আমার ভোটটি নিবন্ধিত করতে চাই comefrom- আমি ইন্টারকলের কমফরম বিবৃতিটি দেখেছি এমন প্রথম উপযুক্ত ব্যবহার । ধারণাটি হ'ল এটি GOTO এর বিপরীতে ( GOTO বিবৃতি থেকে দূরে ঝাঁপিয়ে দেওয়া ) যাতে এটি আপনার কোড জাম্পে কিছুটা জায়গা করে দেয় COMEFROM বিবৃতিতে।


2

যেহেতু আমরা Task<T>ব্যবহার করছি কীভাবে, এর সাথে ডিল করছিstart বিবৃতিটির পূর্ববর্তী কীওয়ার্ড হিসাবে করা যায় সে হিসাবে:

start var document = FetchAsync(urls[i]);


হুম, সম্ভবত এর finishচেয়ে আরও ভাল কি হতে পারে start?
নায়ক

1

এটি লক্ষণীয় যে এফ # এছাড়াও asyncএর অ্যাসিঙ্ক ওয়ার্কফ্লোতে কীওয়ার্ডটি ব্যবহার করে , যা সি # 5 এ নতুন অ্যাসিঙ্ক কার্যকারিতা হিসাবে প্রায় একই জিনিস। অতএব, আমি সেইটিকে একই রাখব

awaitএফ # তে কীওয়ার্ডের জন্য তারা কেবল let!পরিবর্তে ব্যবহার করে let। সি # এর একই অ্যাসাইনমেন্ট সিনট্যাক্স নেই, সুতরাং তাদের =সাইন ডানদিকে কিছু দরকার । বেনজল যেমন বলেছিলেন, এটি একইভাবে কাজ করে yieldতাই এটি প্রায় তার বৈকল্পিক হওয়া উচিত।


1
একটি "অপেক্ষা" মোটেও কোনও কার্যনির্বাহী হওয়া উচিত নয় (যদিও এটি সাধারণত এটি হয়) (সঠিক নিয়মগুলি এখনও প্রকাশযোগ্য ফর্ম হিসাবে কার্যকর করা যায়নি))
এরিক লিপার্ট

1
@ এরিক, এফ # তে এটি হবে do!তবে আপনি জানতেন ...
বেনজল

1

yield async FetchAsync(..)


asyncআপনি যে পদ্ধতিটি চালাচ্ছেন সেটিকে আপনার পরিমার্জন করার দরকারের সাথে এটি পুরোপুরি চলে । এবং বর্তমানের অর্থার্থক অর্থটিও yield return, আপনি ফিরে আসেন এবং যখন এই ক্ষেত্রে আপনি অ্যাসিঙ্ক্রোনাস পদ্ধতি আপনার মৃত্যুদন্ড ফলনশীল করছি enumerating কোডে উৎপাদনের মৃত্যুদন্ড।

ভাবুন ভবিষ্যতে যদি এর জন্য অন্যান্য yieldব্যবহারও হয় তবে আমরা একটি যুক্ত করতে পারিyield x যেখানে বেশিরভাগ একই জিনিস ফলন কার্যকরকরণের জন্য এই সমস্ত ভিন্ন কীওয়ার্ডের পরিবর্তে এক্স চকচকে নতুন বৈশিষ্ট্য।

সত্যি বলতে কী, আমি 'কার্যকর ফল দিচ্ছি না' যুক্তিটি বেশ বুঝতে পারি না। সর্বোপরি, অন্য পদ্ধতিটি কল করার বিন্দুটি ইতিমধ্যে সেই পদ্ধতিতে 'ফলন সম্পাদন' করার জন্য নয়? এটি অবিচ্ছিন্ন কিনা তা নির্বিশেষে? আমি কি এখানে কিছু মিস করছি?

এবং যদি আপনার জন্য ভাল async রিটার্নগুলি সিঙ্ক্রোনালিভাবে হয় তবে কীওয়ার্ডটি থাকে তবে তা বোঝানো উচিত যে পদ্ধতিটি অযৌক্তিকভাবে চালিত হওয়ার সম্ভাবনা রয়েছে এবং আপনি অন্য পদ্ধতিতে কার্যকর হতে চলেছেন। পদ্ধতিটি অ্যাসিনক্রোনাস কলগুলি করে কিনা তা বিবেচনা না করেই আপনার পদ্ধতির অ্যাকাউন্ট হওয়া উচিত।

আইএমও আমি মনে করি বিভিন্ন 'ফলন নয়' মামলাগুলি বাস্তবায়নের বিশদ। আমি বরং ভাষায় ধারাবাহিকতার জন্য নিশ্চয়তা দিই (অর্থাত্ পুনঃব্যবহার yield)।


0

কীভাবে complete, "আমি কাজটি শেষ করতে চাই" তেমন?

Task<byte[]> downloadTask = DownloadFileAsync(url);
byte[] data = complete downloadTask;

1
ডাউনটা কেন? ডাউনটাটিংয়ের পরে কমপক্ষে নিজেকে ব্যাখ্যা করা সৌজন্য বিষয়।
অ্যালন গুরালেনেক

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