Async এবং Await দুটি গুরুত্বপূর্ণ কিওয়ার্ড যা অ্যাসিঙ্ক্রোনাস প্রোগ্রামিংয়ে ব্যবহৃত হয়। এগুলোর মাধ্যমে অ্যাপ্লিকেশনকে দ্রুত এবং দক্ষভাবে কাজ করার জন্য ডেটা ফেচিং (যেমন API কল বা ডাটাবেস থেকে ডেটা আনা) পরিচালনা করা যায়। এই প্রক্রিয়া অ্যাপ্লিকেশনের ইউআই থ্রেড ব্লক না করে ডেটা প্রক্রিয়া করে, যার ফলে অ্যাপ্লিকেশন আরও রেসপন্সিভ থাকে।
এখানে Async এবং Await এর মাধ্যমে ডেটা ফেচিং প্রক্রিয়া কিভাবে কাজ করে তা .NET MAUI অ্যাপ্লিকেশন এ ব্যবহার করার জন্য উদাহরণসহ আলোচনা করা হবে।
1. Async এবং Await কী?
- Async: একটি মেথডকে অ্যাসিঙ্ক্রোনাস হিসেবে চিহ্নিত করতে
asyncকিওয়ার্ড ব্যবহার করা হয়। এটি মেথডটি পরিচালনার জন্য অপেক্ষা করতে সক্ষম হবে এবং থ্রেড ব্লক না করেই অন্যান্য কাজ করতে পারবে। - Await:
awaitকিওয়ার্ডটি অ্যাসিঙ্ক্রোনাস মেথডের সাথে ব্যবহৃত হয়, যাতে সে নির্দিষ্ট কাজের সমাপ্তি না হওয়া পর্যন্ত প্রোগ্রাম অপেক্ষা করে।
এই দুটি কিওয়ার্ড একসাথে ব্যবহৃত হলে, ইউজার ইন্টারফেস থ্রেড ব্লক না করে একটি অ্যাসিঙ্ক্রোনাস কাজ সম্পাদিত হয়।
2. Async এবং Await ব্যবহার করে Data Fetching:
ধরা যাক, আমাদের একটি API থেকে ডেটা ফেচ করতে হবে। আমরা একটি HTTP অনুরোধ করতে যাচ্ছি এবং ডেটা আসা না পর্যন্ত অন্য কাজ চালিয়ে যেতে চাই।
Step 1: HTTP Client তৈরি করা
এখানে একটি সাধারণ HTTP ক্লায়েন্ট ব্যবহার করা হবে, যাতে API থেকে ডেটা ফেচ করা যায়।
using System.Net.Http;
using System.Threading.Tasks;
public class DataService
{
private readonly HttpClient _httpClient;
public DataService()
{
_httpClient = new HttpClient();
}
// Async Method for fetching data
public async Task<string> GetDataFromApiAsync(string url)
{
try
{
// Awaiting the API response
var response = await _httpClient.GetStringAsync(url);
return response;
}
catch (Exception ex)
{
// Handle errors
return $"Error: {ex.Message}";
}
}
}
এখানে GetDataFromApiAsync মেথডটি একটি অ্যাসিঙ্ক্রোনাস HTTP GET অনুরোধ পাঠায় এবং API থেকে ডেটা ফেরত পায়। await কিওয়ার্ডটি HTTP অনুরোধের পূর্ণতা না আসা পর্যন্ত অপেক্ষা করবে, কিন্তু অ্যাপ্লিকেশন থ্রেডকে ব্লক করবে না।
Step 2: ViewModel তৈরি করা (MVVM Pattern)
এখন, আমরা একটি ViewModel তৈরি করব যেখানে ডেটা ফেচিং প্রক্রিয়া এবং UI আপডেট করা হবে।
using System.ComponentModel;
using System.Threading.Tasks;
public class MainPageViewModel : INotifyPropertyChanged
{
private string _data;
private readonly DataService _dataService;
public string Data
{
get => _data;
set
{
_data = value;
OnPropertyChanged(nameof(Data));
}
}
public MainPageViewModel()
{
_dataService = new DataService();
}
// Command to fetch data asynchronously
public async Task FetchDataAsync()
{
var url = "https://api.example.com/data"; // Sample API endpoint
Data = await _dataService.GetDataFromApiAsync(url); // Await the data fetching
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
এখানে, MainPageViewModel-এ FetchDataAsync মেথডটি অ্যাসিঙ্ক্রোনাসভাবে ডেটা ফেচ করার জন্য তৈরি করা হয়েছে। আমরা DataService ব্যবহার করে API থেকে ডেটা আসার পরে তা Data প্রোপার্টিতে সেট করব।
Step 3: XAML ফাইল (UI) তে ডেটা ফেচিং ব্যবহার করা
এখন XAML ফাইলে, আমরা একটি বাটন ব্যবহার করে ডেটা ফেচ করার জন্য ViewModel-এর FetchDataAsync মেথড কল করব এবং ডেটা UI তে দেখাব।
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="YourAppNamespace.MainPage">
<StackLayout Padding="10">
<Label Text="{Binding Data}" />
<Button Text="Fetch Data"
Command="{Binding FetchDataCommand}" />
</StackLayout>
</ContentPage>
এখানে Label এর মাধ্যমে আমরা ViewModel থেকে আসা ডেটা প্রদর্শন করছি এবং Button এর মাধ্যমে FetchDataAsync মেথডটি কল করছি।
Step 4: ViewModel-এ Command যুক্ত করা
ViewModel-এ FetchDataCommand নামে একটি ICommand প্রোপার্টি যুক্ত করতে হবে, যা বাটনের ক্লিকের মাধ্যমে ডেটা ফেচিং কল করবে।
using System.Windows.Input;
using Xamarin.Forms;
public class MainPageViewModel : INotifyPropertyChanged
{
private string _data;
private readonly DataService _dataService;
public string Data
{
get => _data;
set
{
_data = value;
OnPropertyChanged(nameof(Data));
}
}
public ICommand FetchDataCommand { get; }
public MainPageViewModel()
{
_dataService = new DataService();
FetchDataCommand = new Command(async () => await FetchDataAsync());
}
// Async method to fetch data
private async Task FetchDataAsync()
{
var url = "https://api.example.com/data"; // Example API URL
Data = await _dataService.GetDataFromApiAsync(url); // Fetch data asynchronously
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
এখানে, FetchDataCommand যখন এক্সিকিউট হবে, তখন FetchDataAsync মেথডটি কল হবে এবং ডেটা UI তে প্রদর্শিত হবে।
সারাংশ:
Async এবং Await ব্যবহারের মাধ্যমে ডেটা ফেচিং করতে হলে, প্রথমে অ্যাসিঙ্ক্রোনাস মেথড তৈরি করতে হয় যা সাইট থেকে ডেটা ফেচ করবে। তারপর সেই মেথডটি ViewModel-এ ব্যবহার করা হয়, যাতে ডেটা অ্যাসিঙ্ক্রোনাসভাবে UI-তে প্রদর্শন করা যায়। await কিওয়ার্ডের মাধ্যমে ডেটা ফেচিংয়ের কাজ চলে যাওয়ার আগে UI থ্রেড ব্লক হয় না, এবং অ্যাপ্লিকেশন আরও রেসপন্সিভ থাকে।
এই পদ্ধতির মাধ্যমে আপনি API কল, ডাটাবেস ফেচিং বা অন্য কোনো দীর্ঘ প্রসেসিং অ্যাসিঙ্ক্রোনাসভাবে সম্পাদন করতে পারেন, যা অ্যাপ্লিকেশনের পারফরম্যান্সকে উন্নত করে।
Read more