একজন গেটর বা সেটার থেকে একটি অ্যাসিঙ্ক পদ্ধতিটি কীভাবে কল করবেন?


223

সি # তে গেটার বা সেটটারের কাছ থেকে অ্যাসিঙ্ক পদ্ধতিটি কল করার সবচেয়ে মার্জিত উপায় কী হবে?

নিজেকে ব্যাখ্যা করার জন্য এখানে কয়েকটি সিউডো কোড রয়েছে।

async Task<IEnumerable> MyAsyncMethod()
{
    return await DoSomethingAsync();
}

public IEnumerable MyList
{
    get
    {
         //call MyAsyncMethod() here
    }
}

4
আমার প্রশ্ন হবে কেন। কোনও সম্পত্তির ক্ষেত্রের মতো এমন কিছু নকল করার কথা রয়েছে যাতে এটি সাধারণত খুব কম (বা কমপক্ষে খুব দ্রুত) কাজ করা উচিত perform যদি আপনার দীর্ঘমেয়াদী সম্পত্তি থাকে তবে এটি একটি পদ্ধতি হিসাবে এটি লেখার চেয়ে আরও ভাল the তাই কলকারী জানেন যে এটি একটি আরও জটিল কাজ।
জেমস মাইকেল হরে

@ জেমস: এটি ঠিকই সঠিক - এবং আমি সন্দেহ করি যে কেন এটি সিটিপিতে স্পষ্টভাবে সমর্থনযোগ্য নয়। বলা হচ্ছে, আপনি সর্বদা প্রকারের সম্পত্তিটি তৈরি Task<T>করতে পারেন যা অবিলম্বে ফিরে আসবে, সাধারণ সম্পত্তির শব্দার্থবিজ্ঞান থাকতে পারে এবং এখনও প্রয়োজনীয় বিষয়গুলিকে সংযোজিত হিসাবে বিবেচনা করার অনুমতি দেয়।
রিড কোপসে

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


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

উত্তর:


211

প্রযুক্তিগত কোনও কারণ নেই যে asyncসি # তে বৈশিষ্ট্যগুলি অনুমোদিত নয়। এটি উদ্দেশ্যমূলক নকশার সিদ্ধান্ত ছিল, কারণ "অ্যাসিনক্রোনাস প্রপার্টি" একটি অক্সিমোরন।

বৈশিষ্ট্যগুলি বর্তমান মানগুলি ফিরিয়ে আনতে হবে; তাদের পটভূমি ক্রিয়াকলাপ শুরু করা উচিত নয়।

সাধারণত, যখন কেউ "অ্যাসিনক্রোনাস প্রপার্টি" চায়, তখন তারা আসলে যা চায় তা এর মধ্যে একটি:

  1. একটি অ্যাসিনক্রোনাস পদ্ধতি যা একটি মান দেয়। এই ক্ষেত্রে, সম্পত্তিটি একটি asyncপদ্ধতিতে পরিবর্তন করুন ।
  2. একটি মান যা ডাটা-বন্ডিংয়ে ব্যবহার করা যেতে পারে তবে অবশ্যই গণনা করা / সংযুক্তি হিসাবে পুনরুদ্ধার করা উচিত। এই ক্ষেত্রে, হয় অন্তর্ভুক্ত asyncবস্তুর জন্য একটি কারখানা পদ্ধতি ব্যবহার করুন বা একটি async InitAsync()পদ্ধতি ব্যবহার করুন । মান- default(T)গণনা / পুনরুদ্ধার না হওয়া অবধি ডেটা-বেঁধে থাকা মানটি হবে ।
  3. একটি মান যা তৈরি করা ব্যয়বহুল, তবে ভবিষ্যতে ব্যবহারের জন্য এটি ক্যাশে করা উচিত। এই ক্ষেত্রে, AsyncLazy আমার ব্লগ বা AsyncEx গ্রন্থাগার থেকে ব্যবহার করুন । এটি আপনাকে একটি awaitউপযুক্ত সম্পত্তি দেবে।

আপডেট: আমি আমার সাম্প্রতিক " অ্যাসিঙ্ক ওওপি" ব্লগ পোস্টগুলিতে অ্যাসিঙ্ক্রোনাস বৈশিষ্ট্যগুলি কভার করি ।


বিন্দু ২. তবে আপনি নিয়মিত দৃশ্যের বিষয়টি বিবেচনা করবেন না যেখানে সম্পত্তি নির্ধারণের ফলে আবার অন্তর্নিহিত ডেটা শুরু করা উচিত (কেবলমাত্র নির্মাণকারী নয়)। নিতো অ্যাসিনেক্স ব্যবহার বা ব্যবহার ছাড়াও কি অন্য কোনও উপায় আছে Dispatcher.CurrentDispatcher.Invoke(new Action(..)?
জেরার্ড

@ জিার্ড: আমি দেখতে পাচ্ছি না কেন পয়েন্ট (২) সে ক্ষেত্রে কাজ করবে না। কেবল বাস্তবায়ন করুন INotifyPropertyChangedএবং তারপরে সিদ্ধান্ত নিন যে আপনি পুরানো মানটি ফেরত চান বা default(T)অ্যাসিঙ্ক্রোনাস আপডেট ফ্লাইটে রয়েছে কিনা।
স্টিফেন ক্লিয়ারি

1
@ স্টেফান: ঠিক আছে, তবে আমি যখন সেটারে অ্যাসিঙ্ক পদ্ধতিটি কল করি তখন আমি CS4014 "প্রতীক্ষিত নয়" সতর্কতাটি পাই (বা এটি কেবল ফ্রেমওয়ার্ক ৪.০ এ?)। আপনি কি এই জাতীয় সতর্কবাণীকে দমন করার পরামর্শ দিচ্ছেন?
জেরার্ড

@ জেরার্ড: আমার প্রথম প্রস্তাবটি NotifyTaskCompletionহ'ল আমার অ্যাসিনেক্সেক্স প্রকল্পটি ব্যবহার করা । অথবা আপনি নিজের তৈরি করতে পারেন; এটা যে কঠিন না।
স্টিফেন ক্লিয়ারি

1
@ স্টেফান: ঠিক আছে এটি চেষ্টা করবে। এই অ্যাসিনক্রোনাস ডাটাবাইন্ডিং-ভিউ মডেল-দৃশ্য সম্পর্কে একটি দুর্দান্ত নিবন্ধ সম্ভবত রয়েছে। উদাহরণস্বরূপ বাঁধাই করা {Binding PropName.Result}আমার পক্ষে তুচ্ছ নয়।
জেরার্ড

101

আপনি এটিকে অবিচ্ছিন্নভাবে বলতে পারবেন না, যেহেতু কোনও অ্যাসিনক্রোনাস সম্পত্তি সমর্থন নেই, কেবল অ্যাসিঙ্ক পদ্ধতি। যেমন, সেখানে দুটি বিকল্প যে, আসলে অন্তর্গত CTP ইন অসমনিয়ত পদ্ধতি সত্যিই শুধু একটি পদ্ধতি যা আয় হয় উভয় সুযোগ নিচ্ছে Task<T>বা Task:

// Make the property return a Task<T>
public Task<IEnumerable> MyList
{
    get
    {
         // Just call the method
         return MyAsyncMethod();
    }
}

বা:

// Make the property blocking
public IEnumerable MyList
{
    get
    {
         // Block via .Result
         return MyAsyncMethod().Result;
    }
}

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

3
@ ডুলুকা: আপনি এমন একটি পদ্ধতি রাখার চেষ্টা করতে পারেন যা এর মতো private async void SetupList() { MyList = await MyAsyncMethod(); } মাইলিস্ট সেট হয়ে যায় (এবং তারপরে স্বয়ংক্রিয়ভাবে বেঁধে দেওয়া হয়, যদি এটি আইএনপিসি প্রয়োগ করে) অ্যাসিঙ্ক অপারেশন শেষ হওয়ার সাথে সাথে ...
রিড কোপসি

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

1
@ ডুলুকা: কার্যকরভাবে, আমি আপনাকে যা করার পরামর্শ দিয়েছিলাম তা ছিল ... অনুধাবন করুন, যদিও আপনি যদি শিরোনামটি একাধিকবার দ্রুত অ্যাক্সেস করেন তবে আপনার বর্তমান সমাধানটি একাধিক কলকে একসাথে ডেকে আনবে getTitle()...
রিড কোপসি

খুব ভাল পয়েন্ট। যদিও আমার সুনির্দিষ্ট ক্ষেত্রে কোনও সমস্যা না হলেও ইসলোডিংয়ের জন্য একটি বুলিয়ান চেকটি সমস্যার সমাধান করবে।
ডোগুহান উলুকা

55

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

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

string _Title;
public string Title
{
    get
    {
        if (_Title == null)
        {   
            Deployment.Current.Dispatcher.InvokeAsync(async () => { Title = await getTitle(); });
        }
        return _Title;
    }
    set
    {
        if (value != _Title)
        {
            _Title = value;
            RaisePropertyChanged("Title");
        }
    }
}

9
উইন 8 আরপি- তে 18/07/2012 থেকে আপডেটটি আমাদের ডিসপ্যাচারের কলটি পরিবর্তন করতে হবে: উইন্ডো.কর্নর.কোর উইন্ডো.ডিসপ্যাচার.আরএনসিঙ্ক (কোরডিসপ্যাচার প্রাইরিটি.নরমাল, অ্যাসিঙ্ক () => {শিরোনাম = getTytleAsync (url);}) অপেক্ষা;
আন্তন সিজিকভ

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

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

1
মূলত, প্রথম প্রাপ্তি একটি নাল মান প্রদান করবে, তারপরে এটি আপডেট হবে। মনে রাখবেন যে আমরা যদি প্রতিবার getTitle কল করা যায় তবে খারাপ লুপ হতে পারে।
তোফুটিম

1
আপনার এও সচেতন হওয়া উচিত যে সেই অ্যাসিঙ্ক কলটিতে যে কোনও ব্যতিক্রম সম্পূর্ণ গ্রাস করা হবে। এমনকি যদি আপনার কাছে থাকে তবে তারা অ্যাপ্লিকেশনটিতে আপনার অপরিশোধিত ব্যতিক্রম হ্যান্ডলারের কাছে পৌঁছায় না।
ফিল্টার

9

আমি মনে করি যে আমরা কেবল প্রথমে নাল ফিরে আসার জন্য অপেক্ষা করতে পারি এবং তারপরে প্রকৃত মান পেতে পারি, সুতরাং খাঁটি এমভিভিএমের ক্ষেত্রে (উদাহরণস্বরূপ পিসিএল প্রকল্প) আমি মনে করি নিম্নলিখিতটি সবচেয়ে মার্জিত সমাধান:

private IEnumerable myList;
public IEnumerable MyList
{
  get
    { 
      if(myList == null)
         InitializeMyList();
      return myList;
     }
  set
     {
        myList = value;
        NotifyPropertyChanged();
     }
}

private async void InitializeMyList()
{
   MyList = await AzureService.GetMyList();
}

3
এটি কি সংকলক সতর্কতা তৈরি করে নাCS4014: Async method invocation without an await expression
নিক

6
হতে খুব এই উপদেশ নিম্নলিখিত সন্দেহপ্রবণ। এই ভিডিওটি দেখুন তারপরে আপনার নিজের মন তৈরি করুন: চ্যানেল 9.msdn.com/Series/Three-Essential- টিপস- for-Ancnc/…
কনটাঙ্গো

1
আপনি "async বাতিল" পদ্ধতি ব্যবহার করা এড়ানো উচিত নয়!
সুপারজেএমএন

1
প্রতিটি চিৎকার একটি বুদ্ধিমান জবাব নিয়ে আসা উচিত, আপনি @ সুপার জেএমএন কেন আমাদের ব্যাখ্যা করবেন?
জুয়ান পাবলো গার্সিয়া কোয়েলো 26'17

1
@ কনটাঙ্গো ভাল ভিডিও। তিনি বলেছিলেন, " async voidকেবলমাত্র শীর্ষ-স্তরের হ্যান্ডলার এবং তাদের পছন্দগুলির জন্য ব্যবহার করুন "। আমি মনে করি এটি "এবং তাদের মত" হিসাবে যোগ্য হতে পারে।
শুভনোমাদ

7

আপনি এটির Taskমতো ব্যবহার করতে পারেন :

public int SelectedTab
        {
            get => selected_tab;
            set
            {
                selected_tab = value;

                new Task(async () =>
                {
                    await newTab.ScaleTo(0.8);
                }).Start();
            }
        }

5

আমি ভেবেছিলাম .GETAwaiter ()। GetResult () ঠিক এই সমস্যার সমাধান ছিল, না? উদাহরণ:

string _Title;
public string Title
{
    get
    {
        if (_Title == null)
        {   
            _Title = getTitle().GetAwaiter().GetResult();
        }
        return _Title;
    }
    set
    {
        if (value != _Title)
        {
            _Title = value;
            RaisePropertyChanged("Title");
        }
    }
}

5
এটি কেবল অবরুদ্ধকরণের মতোই .Result- এটি অ্যাসিঙ্ক নয় এবং এর ফলে ডেডলকস আসতে পারে।
ম্যাকগুইয়ারভি

আপনার দরকার ইসএন্সিঙ্ক = সত্য
অ্যালেক্সান্ডার টের

আমি আমার উত্তর সম্পর্কে প্রতিক্রিয়া প্রশংসা করি; আমি কারও পক্ষে একটি উদাহরণ প্রদান করতে সত্যিই পছন্দ করব যেখানে এই অচলাবস্থা রয়েছে যাতে আমি এটি
কার্যকরভাবে

2

যেহেতু আপনার "অ্যাসিঙ্ক সম্পত্তি" একটি ভিউ মডেলটিতে রয়েছে তাই আপনি অ্যাসিঙ্কএমভিভিএম ব্যবহার করতে পারেন :

class MyViewModel : AsyncBindableBase
{
    public string Title
    {
        get
        {
            return Property.Get(GetTitleAsync);
        }
    }

    private async Task<string> GetTitleAsync()
    {
        //...
    }
}

এটি আপনার জন্য সিঙ্ক্রোনাইজেশন প্রসঙ্গ এবং সম্পত্তি পরিবর্তন বিজ্ঞপ্তির যত্ন নেবে।


সম্পত্তি হওয়ায় তা হতেই হবে।
দিমিত্রি শেচম্যান

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

সংজ্ঞা অনুসারে সম্পত্তিগুলি ব্লক করা হচ্ছে। গেটিটেলএেন্সেন্স () একটি "অ্যাসিঙ্ক গেটার" সিনট্যাকটিক চিনির সান হিসাবে কাজ করে।
দিমিত্রি শেচম্যান

1
@ দিমিত্রি শেচটম্যান: না, এটি ব্লক করার দরকার নেই। পরিবর্তনের বিজ্ঞপ্তিগুলি এবং রাষ্ট্রীয় মেশিনগুলি ঠিক এটির জন্য। এবং তারা সংজ্ঞা দিয়ে বাধা দিচ্ছে না। সংজ্ঞা অনুসারে এগুলি সিঙ্ক্রোনাস। এটি ব্লক করার মতো নয়। "ব্লকিং" এর অর্থ তারা ভারী কাজ করতে পারে এবং সম্পাদন করতে যথেষ্ট সময় ব্যয় করতে পারে। এটি ঘুরে দেখা যায় ঠিক কী বৈশিষ্ট্যগুলি করা উচিত নয়।
কোয়েটজলকোটল

1

Necromancing।
। নেট কোর / নেট স্ট্যান্ডার্ড 2 এ, আপনি এর Nito.AsyncEx.AsyncContext.Runপরিবর্তে ব্যবহার করতে পারেন System.Windows.Threading.Dispatcher.InvokeAsync:

class AsyncPropertyTest
{

    private static async System.Threading.Tasks.Task<int> GetInt(string text)
    {
        await System.Threading.Tasks.Task.Delay(2000);
        System.Threading.Thread.Sleep(2000);
        return int.Parse(text);
    }


    public static int MyProperty
    {
        get
        {
            int x = 0;

            // /programming/6602244/how-to-call-an-async-method-from-a-getter-or-setter
            // /programming/41748335/net-dispatcher-for-net-core
            // https://github.com/StephenCleary/AsyncEx
            Nito.AsyncEx.AsyncContext.Run(async delegate ()
            {
                x = await GetInt("123");
            });

            return x;
        }
    }


    public static void Test()
    {
        System.Console.WriteLine(System.DateTime.Now.ToString("dd.MM.yyyy HH:mm:ss.fff"));
        System.Console.WriteLine(MyProperty);
        System.Console.WriteLine(System.DateTime.Now.ToString("dd.MM.yyyy HH:mm:ss.fff"));
    }


}

আপনি যদি কেবল System.Threading.Tasks.Task.Runবা বাছাই করেন System.Threading.Tasks.Task<int>.Runতবে তা কার্যকর হবে না।


-1

আমি মনে করি আমার নীচের উদাহরণটি @ স্টিফেন-ক্লিয়ারির পদ্ধতির অনুসরণ করতে পারে তবে আমি একটি কোডেড উদাহরণ দিতে চাই। এটি ডেটা বাইন্ডিং প্রসঙ্গে ব্যবহারের জন্য উদাহরণস্বরূপ জামারিন।

শ্রেণীর নির্মাতা - বা প্রকৃতপক্ষে এটি নির্ভরশীল অন্য কোনও সম্পত্তির সেটার - একটি অ্যাসিঙ্ক শূন্যতা কল করতে পারে যা প্রত্যাশিত বা ব্লকের প্রয়োজন ছাড়াই কাজ শেষ হওয়ার পরে সম্পত্তিটি বসিয়ে দেবে। যখন এটি অবশেষে একটি মান পায় এটি NotifPropertyChanged প্রক্রিয়াটির মাধ্যমে আপনার UI আপডেট করবে।

আমি কোনও কনস্ট্রাক্টর থেকে অ্যাসিনকে অকার্যকর কল করার কোনও পার্শ্ব প্রতিক্রিয়া সম্পর্কে নিশ্চিত নই। সম্ভবত কোনও মন্তব্যকারী ত্রুটি পরিচালনার বিষয়ে বিস্তারিত বর্ণনা করবে ইত্যাদি etc.

class MainPageViewModel : INotifyPropertyChanged
{
    IEnumerable myList;

    public event PropertyChangedEventHandler PropertyChanged;

    public MainPageViewModel()
    {

        MyAsyncMethod()

    }

    public IEnumerable MyList
    {
        set
        {
            if (myList != value)
            {
                myList = value;

                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs("MyList"));
                }
            }
        }
        get
        {
            return myList;
        }
    }

    async void MyAsyncMethod()
    {
        MyList = await DoSomethingAsync();
    }


}

-1

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

string someValue=null;
var t = new Thread(() =>someValue = SomeAsyncMethod().Result);
t.Start();
t.Join();

আপনি তর্ক করতে পারেন যে আমি ফ্রেমওয়ার্কটি অপব্যবহার করি তবে এটি কার্যকর হয়।


-1

আমি সমস্ত উত্তর পর্যালোচনা করি তবে সবার কার্য সম্পাদনের সমস্যা রয়েছে।

উদাহরণস্বরূপ:

string _Title;
public string Title
{
    get
    {
        if (_Title == null)
        {   
            Deployment.Current.Dispatcher.InvokeAsync(async () => { Title = await getTitle(); });
        }
        return _Title;
    }
    set
    {
        if (value != _Title)
        {
            _Title = value;
            RaisePropertyChanged("Title");
        }
    }
}

ডিপ্লোয়মেন্ট.কন্টেন.ডিসপ্যাচার.আইনভোকএসিঙ্ক (অ্যাসিঙ্ক () => {শিরোনাম = getTitle ();}) অপেক্ষা;

প্রেরণকারী ব্যবহার করুন যা একটি ভাল উত্তর নয়।

তবে একটি সহজ সমাধান আছে, কেবল এটি করুন:

string _Title;
    public string Title
    {
        get
        {
            if (_Title == null)
            {   
                Task.Run(()=> 
                {
                    _Title = getTitle();
                    RaisePropertyChanged("Title");
                });        
                return;
            }
            return _Title;
        }
        set
        {
            if (value != _Title)
            {
                _Title = value;
                RaisePropertyChanged("Title");
            }
        }
    }

যদি আপনার ফাংশন অ্যাসিন হয় তবে getTitle () এর পরিবর্তে getTitle () অপেক্ষা করুন () ব্যবহার করুন
মাহদী

-4

আপনি সূত্র পরিবর্তন করতে পারেন Task<IEnumerable>

এবং এর মতো কিছু করুন:

get
{
    Task<IEnumerable>.Run(async()=>{
       return await getMyList();
    });
}

এবং এটি মাইলিস্টের অপেক্ষার মতো ব্যবহার করুন;

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