نمایش نتایج 1 تا 10 از 10

نام تاپیک: تبدیل یک تابع به صورت async

  1. #1
    کاربر دائمی آواتار رامین مرادی
    تاریخ عضویت
    اردیبهشت 1389
    محل زندگی
    آذربایجان
    پست
    1,961

    Question تبدیل یک تابع به صورت async

    وقت بخیر دوستان من تابع زیر رو دارم به نظرتون میشه اینو بصورت همزمان اجراش کرد؟؟ در صورت امکان همراه با توضیحات بگید
    این کد اصلی خودمه


    public void ShowAll()
    {
    AsansorDA _AsansorDA = new AsansorDA();
    table = _AsansorDA.SelectAll();
    dgv1.DataSource = table;

    }



    که به این صورت نوشتم


    private async Task ShowAll()
    {
    await Task.Run(() =>
    {
    AsansorDA _AsansorDA = new AsansorDA();
    table = _AsansorDA.SelectAll();
    dgv1.DataSource = table;
    });
    }



    که به Run گیر میده یعنی کلا برای تسک چنین متدی نیست.

  2. #2

    نقل قول: تبدیل یک تابع به صورت async

    سلام،
    کلاس 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();

    موفق باشید.
    آخرین ویرایش به وسیله ramtinak : شنبه 16 دی 1396 در 18:22 عصر

  3. #3
    کاربر دائمی آواتار رامین مرادی
    تاریخ عضویت
    اردیبهشت 1389
    محل زندگی
    آذربایجان
    پست
    1,961

    نقل قول: تبدیل یک تابع به صورت async

    ممنون دوست عزیز.ولی کلا به تابع SelectAll() گیر میده
    Error 5 Cannot find all types required by the 'async' modifier. Are you targeting the wrong framework version, or missing a reference to an assembly?

    فریم ورک پروژم هم 4 هست.
    به await هم گیر میده
    Error 2 The 'await' operator can only be used within an async method. Consider marking this method with the 'async' modifier and changing its return type to 'Task'.

    به اکسپشن هم گیر میده.

  4. #4
    مدیر بخش آواتار danialafshari
    تاریخ عضویت
    تیر 1387
    محل زندگی
    هر کجا هستم باشم آسمان مال من است
    پست
    2,909

    نقل قول: تبدیل یک تابع به صورت async

    نقل قول نوشته شده توسط رامین مرادی مشاهده تاپیک
    ممنون دوست عزیز.ولی کلا به تابع SelectAll() گیر میده
    Error 5 Cannot find all types required by the 'async' modifier. Are you targeting the wrong framework version, or missing a reference to an assembly?

    فریم ورک پروژم هم 4 هست.
    به await هم گیر میده
    Error 2 The 'await' operator can only be used within an async method. Consider marking this method with the 'async' modifier and changing its return type to 'Task'.

    به اکسپشن هم گیر میده.
    با سلام
    ارور Error 5 Cannot find all types required by the 'async' modifier. Are you targeting the wrong framework version, or missing a reference to an assembly?
    طبق ارور دات نت تنظیم نیست و باید روی 4.5 به بعد قرار بدید
    Error 2 The 'await' operator can only be used within an async method. Consider marking this method with the 'async' modifier and changing its return type to 'Task'.
    این خطا هم میگه بدلیل اینکه async ی وجود نداره await ی هم نخواهد بود.
    یک مثال از async :

    private Task<string> DoWork()
    {
    return Task.Run(() =>
    {
    System.Threading.Thread.Sleep(10000);
    return "Done.";
    });
    }


    private async void CallButton_Click(object sender, EventArgs e)
    {
    this.Text = await DoWork();
    }

    موفق باشید
    لطفاً از پرسیدن سوال در خصوصی خودداری کنید.
    قبل از ایجاد تاپیک، حتماً قوانین سایت را مطالعه فرمایید.
    قوانین پرسش های دانشجویی
    برای درست وارد شدن کد در قالب C#‎‎‎ سایت، ابتدا کد رو درون Notepad.exe کپی سپس از اونجا به سایت در قالب C#‎‎‎ منتفل کنید
    نرم افزار code manager دستیار برنامه نویسان جهت نگهداری کد ها

  5. #5
    کاربر دائمی آواتار رامین مرادی
    تاریخ عضویت
    اردیبهشت 1389
    محل زندگی
    آذربایجان
    پست
    1,961

    نقل قول: تبدیل یک تابع به صورت async

    نقل قول نوشته شده توسط danialafshari مشاهده تاپیک
    با سلام
    ارور Error 5 Cannot find all types required by the 'async' modifier. Are you targeting the wrong framework version, or missing a reference to an assembly?
    طبق ارور دات نت تنظیم نیست و باید روی 4.5 به بعد قرار بدید
    Error 2 The 'await' operator can only be used within an async method. Consider marking this method with the 'async' modifier and changing its return type to 'Task'.
    این خطا هم میگه بدلیل اینکه async ی وجود نداره await ی هم نخواهد بود.
    یک مثال از async :

    private Task<string> DoWork()
    {
    return Task.Run(() =>
    {
    System.Threading.Thread.Sleep(10000);
    return "Done.";
    });
    }


    private async void CallButton_Click(object sender, EventArgs e)
    {
    this.Text = await DoWork();
    }

    موفق باشید
    با این میشه به اشیایی مثل دیتا گرید دسترسی داشت؟

  6. #6
    کاربر دائمی آواتار رامین مرادی
    تاریخ عضویت
    اردیبهشت 1389
    محل زندگی
    آذربایجان
    پست
    1,961

    نقل قول: تبدیل یک تابع به صورت async

    من با برداشتی که از حرفای شما دوستان داشتم اون کد رو تبدیل کردم به اینی که نوشتم. ولی به فراخوانی تابع گیر میده


    public void ShowAll()
    {
    AsansorDA _AsansorDA = new AsansorDA();
    table =await SelectAll();
    dgv1.DataSource = table;

    }

    public async Task<DataTable> SelectAll()
    {
    await Task.Factory.StartNew(() =>
    {
    try
    {
    AsansorDA _AsansorDA = new AsansorDA();
    table = _AsansorDA.SelectAll();
    return table;
    }
    catch (Exception ex)
    {
    MessageBox.Show(ex.Message);
    return null;

    //ex.Exception("RunAsyncEX");
    }
    }, new System.Threading.CancellationTokenSource().Token, TaskCreationOptions.LongRunning, TaskScheduler.Default);
    return new DataTable();
    }



    خطاش هم
    Error 4 The 'await' operator can only be used within an async method. Consider marking this method with the 'async' modifier and changing its return type to 'Task'.

  7. #7
    کاربر دائمی آواتار ali_md110
    تاریخ عضویت
    فروردین 1385
    محل زندگی
    شیراز
    پست
    1,181

    نقل قول: تبدیل یک تابع به صورت async

    اگر برنامه شما تحت ویندوز و تک کاربره هست نیاز انچنانی به پیاده سازی متدهای async await نیست و میتونید کارهای طولانی مدت رو با backgrounworker پیاده کنید
    ولی

    return Task.Run(() =>


    برای برنامه های تحت ویندوز میتوان استفاده کرد اما در سطح وب بکار نبرید این متدها به متدهای تقلبی یا Fake Async مشهور هستند



    public async Task<DataTable> MyMetod()
    {
    return await Task.Run(() =>
    {
    return myvalues;

    });
    }



    private async void _Click(object sender, EventArgs e)
    {
    await Task.Run(() => MyMetod());
    }

  8. #8
    کاربر دائمی آواتار رامین مرادی
    تاریخ عضویت
    اردیبهشت 1389
    محل زندگی
    آذربایجان
    پست
    1,961

    نقل قول: تبدیل یک تابع به صورت async

    نقل قول نوشته شده توسط ali_md110 مشاهده تاپیک
    اگر برنامه شما تحت ویندوز و تک کاربره هست نیاز انچنانی به پیاده سازی متدهای async await نیست و میتونید کارهای طولانی مدت رو با backgrounworker پیاده کنید
    ولی

    return Task.Run(() =>


    برای برنامه های تحت ویندوز میتوان استفاده کرد اما در سطح وب بکار نبرید این متدها به متدهای تقلبی یا Fake Async مشهور هستند



    public async Task<DataTable> MyMetod()
    {
    return await Task.Run(() =>
    {
    return myvalues;

    });
    }



    private async void _Click(object sender, EventArgs e)
    {
    await Task.Run(() => MyMetod());
    }
    نه برنامه تو شبکه کار میکنه و تحت ویندوز و چندین کاربره هست. پس به نظرتون چیکار میشه کرد که مثلا فرم موقع باز شدن داده هارو لود کنه مثلا 1000 رکورد رو .تو روش معمولی مثلا فرم قبل باز شدن چندثانیه منتظر لود شدن داده میشه. اینو یه کاری بشه کرد که همزمان با لود فرم اصلی هم باز بشه

    اینم نوشتم. ولی یه جای کار میلنگه و داده ها برگشت داده نمیشه



    public void ShowAll()
    {
    AsansorDA _AsansorDA = new AsansorDA();
    dgv1.DataSource = Task.Run(() => MyMetod());
    }
    public async Task<DataTable> MyMetod()
    {
    return await Task.Run(() =>
    {
    AsansorDA _AsansorDA = new AsansorDA();
    return _AsansorDA.SelectAll();
    });
    }

  9. #9
    کاربر دائمی آواتار رامین مرادی
    تاریخ عضویت
    اردیبهشت 1389
    محل زندگی
    آذربایجان
    پست
    1,961

    نقل قول: تبدیل یک تابع به صورت async

    با بک گراند ورکر نوشتم.اما نمدونم کارم اصولیه یا نه



    public void ShowAll()
    {
    _worker1.RunWorkerAsync();

    }
    private void _worker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {

    dgv1.DataSource = table;

    }
    private void worker1_DoWork(object sender, DoWorkEventArgs e)
    {
    AsansorDA _AsansorDA = new AsansorDA();
    table = _AsansorDA.SelectAll();
    }


  10. #10

    نقل قول: تبدیل یک تابع به صورت async

    نقل قول نوشته شده توسط رامین مرادی مشاهده تاپیک
    وقت بخیر دوستان من تابع زیر رو دارم به نظرتون میشه اینو بصورت همزمان اجراش کرد؟؟ در صورت امکان همراه با توضیحات بگید
    این کد اصلی خودمه


    public void ShowAll()
    {
    AsansorDA _AsansorDA = new AsansorDA();
    table = _AsansorDA.SelectAll();
    dgv1.DataSource = table;

    }



    که به این صورت نوشتم


    private async Task ShowAll()
    {
    await Task.Run(() =>
    {
    AsansorDA _AsansorDA = new AsansorDA();
    table = _AsansorDA.SelectAll();
    dgv1.DataSource = table;
    });
    }



    که به Run گیر میده یعنی کلا برای تسک چنین متدی نیست.
    به این صورت باید استفاده کنید
     public async static Task<List<Student>> GetAllStudentsAsync()

    {


    MyDatabaseEntities db = new MyDatabaseEntities();


    var query = from item in db.Students


    select item;


    return await query.ToListAsync();


    }

    بعدش برای فراخوانی تابع به این صورت عمل کنید

    var query = GetAllStudentsAsync();

    query.Wait();


    List<Student> data = query.Result;


    Console.WriteLine("Total Records in Students Table are:" + " " + data.Count);

تاپیک های مشابه

  1. تبدیل یک شکل به صورت کروی
    نوشته شده توسط Mahbadgroup در بخش برنامه نویسی Matlab
    پاسخ: 2
    آخرین پست: پنج شنبه 27 فروردین 1394, 10:42 صبح
  2. فراخوانی یک تابع به صورت چند نخی
    نوشته شده توسط ho3ein.3ven در بخش C#‎‎
    پاسخ: 5
    آخرین پست: سه شنبه 04 تیر 1392, 12:38 عصر
  3. کمک در تبدیل یک تابع به سی شارپ
    نوشته شده توسط sh در بخش مباحث عمومی دلفی و پاسکال
    پاسخ: 0
    آخرین پست: سه شنبه 04 فروردین 1388, 00:00 صبح
  4. مقدار بازگشتی یک تابع به صورت picture
    نوشته شده توسط vb_nima در بخش برنامه نویسی در 6 VB
    پاسخ: 1
    آخرین پست: یک شنبه 24 تیر 1386, 20:07 عصر
  5. ارسال آدرس یک تابع به صورت اشاره گر
    نوشته شده توسط Developer Programmer در بخش برنامه نویسی در Delphi
    پاسخ: 1
    آخرین پست: سه شنبه 09 فروردین 1384, 12:46 عصر

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •