سلام،
کلاس Task از دات نت 4.0 به بعد اضافه شده، پس شما کم کم باید Targetـه دات نت پروژتون روی این نسخه باشه تا بتونید از این کلاس استفاده کنید.
--------------------------------------
جای Run
از Task.Factory هم میتونید استفاده کنید. من یه تابع دارم که در ورودیش یک Action میگیره:
static public async Task RunAsync(Action action) {
try
{
await Task.Factory.StartNew(() =>
{
try
{
action?.Invoke();
}
catch (Exception ex)
{
ex.Exception("RunAsyncEX");
}
}, new System.Threading.CancellationTokenSource().Token, TaskCreationOptions.LongRunning, TaskScheduler.Default);
}
catch (Exception ex)
{
ex.Exception("RunAsync");
}
}
شما می تونید کدتون به صورت زیر با این کد ادغام کنید:
await RunAsync(()=>{
AsansorDA _AsansorDA = new AsansorDA();
table = _AsansorDA.SelectAll();
dgv1.DataSource = table;
});
اما ممکنه این کد، خطای Marshal Called بده، و دلیلش هم اینه که شما دارید توی این کد به UI پارامتر میفرستید (dgv1.DataSource...)
حقیقتا زیاد وینفرم کار نکردم اما فکر کنم چون ورودیش Action هست به کدتون گیر نده
--------------
بروز رسانی:
میشه تابع رو به صورت بازگشتی هم نوشت:
public class MyTokenList : List<MToken> {
public async Task<Object> SelectAll()
{
await Task.Factory.StartNew(() =>
{
try
{
AsansorDA _AsansorDA = new AsansorDA();
table = _AsansorDA.SelectAll();
return table;
}
catch (Exception ex)
{
ex.Exception("RunAsyncEX");
}
}, new System.Threading.CancellationTokenSource().Token, TaskCreationOptions.LongRunning, TaskScheduler.Default);
return new Object();
}
}
جای Object که در تعریف تابع و آخر اون نوشته شده، تایپ SelectAll در کد _AsansorDA.SelectAll() قرار بدید.
واسه فراخونی هم کافیه بنویسید:
dgv1.DataSource = await SelectAll();
موفق باشید.