আমি কখন আপনাকে ব্যবহার করতে হবে তার সঠিক আর্কিটেকচার সম্পর্কে আপনার মতামত জানতে চাই Task.Run। আমি আমাদের ডাব্লুপিএফ। নেট 4.5 অ্যাপ্লিকেশনটিতে (ক্যালিবার্ন মাইক্রো কাঠামোর সাথে) ল্যাগি ইউআই অনুভব করছি।
মূলত আমি করছি (খুব সরল কোড স্নিপেটস):
public class PageViewModel : IHandle<SomeMessage>
{
...
public async void Handle(SomeMessage message)
{
ShowLoadingAnimation();
// Makes UI very laggy, but still not dead
await this.contentLoader.LoadContentAsync();
HideLoadingAnimation();
}
}
public class ContentLoader
{
public async Task LoadContentAsync()
{
await DoCpuBoundWorkAsync();
await DoIoBoundWorkAsync();
await DoCpuBoundWorkAsync();
// I am not really sure what all I can consider as CPU bound as slowing down the UI
await DoSomeOtherWorkAsync();
}
}
আমি যে নিবন্ধগুলি / ভিডিওগুলি পড়েছি / দেখেছি তা থেকে, আমি জানি যে await asyncঅগত্যা কোনও পটভূমির থ্রেডে চলছে না এবং পটভূমিতে কাজ শুরু করার জন্য আপনাকে এটি অপেক্ষা করে মোড়ানো প্রয়োজন Task.Run(async () => ... )। ব্যবহার করা async awaitUI কে অবরুদ্ধ করে না, তবুও এটি ইউআই থ্রেডটিতে চলছে তাই এটি এটিকে পিছিয়ে দিচ্ছে।
টাস্ক.রুন রাখার সেরা জায়গাটি কোথায়?
আমি ঠিক করা উচিত
বাইরের কলটি মোড়ানো কারণ এটি .NET এর জন্য থ্রেডিংয়ের কাজ কম
, বা আমার কেবলমাত্র সিপিইউযুক্ত পদ্ধতিগুলি অভ্যন্তরীণভাবে চালানো উচিত যা
Task.Runএটি অন্য জায়গাগুলির জন্য পুনরায় ব্যবহারযোগ্য করে তোলে? আমি এখানে নিশ্চিত নই যে মূলত গভীর পটভূমির থ্রেডগুলিতে কাজ শুরু করা ভাল ধারণা।
বিজ্ঞাপন (1), প্রথম সমাধানটি এরকম হবে:
public async void Handle(SomeMessage message)
{
ShowLoadingAnimation();
await Task.Run(async () => await this.contentLoader.LoadContentAsync());
HideLoadingAnimation();
}
// Other methods do not use Task.Run as everything regardless
// if I/O or CPU bound would now run in the background.
বিজ্ঞাপন (2), দ্বিতীয় সমাধানটি এরকম হবে:
public async Task DoCpuBoundWorkAsync()
{
await Task.Run(() => {
// Do lot of work here
});
}
public async Task DoSomeOtherWorkAsync(
{
// I am not sure how to handle this methods -
// probably need to test one by one, if it is slowing down UI
}
await Task.Run(async () => await this.contentLoader.LoadContentAsync());সহজভাবে হওয়া উচিতawait Task.Run( () => this.contentLoader.LoadContentAsync() );। আফাইক আপনি দ্বিতীয়awaitএবংasyncভিতরে যোগ করে কিছু অর্জন করতে পারেন নাTask.Run। এবং যেহেতু আপনি প্যারামিটারগুলি অতিক্রম করছেন না, এটি কিছুটা আরও সরল করেawait Task.Run( this.contentLoader.LoadContentAsync );।