ورود به حساب ثبت نام جدید فراموشی کلمه عبور
برای ورود به حساب کاربری خود، نام کاربری و کلمه عبورتان را در زیر وارد کرده و روی «ورود به سایت» کلیک کنید.





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









اگر فرم بازیابی کلمه عبور برای شما نمایش داده نمی‌شود، اینجا را کلیک کنید.





صفحه 1 از 2 12 آخرین
نمایش نتایج: از 1 به 10 از 11
  1. #1
    تاریخ عضویت
    2019/09/16
    نوشته ها
    49
    1
    Member

    متد async در سی شارپ

    سلام،
    یک باتن دارم که با زدن آن پیغامی ارسال می گردد و همان لحظه نمایش داده می شود و متدی به صورت پریودیک شروع به کار کرده و در فواصل زمانی مشخص همان پیغام را ارسال میکند ( این متد async تعریف شده ) کاربر هر زمان بخواهد میتواند باتن را بزند ولی نباید با ارسال پریودیک همزمان یا در فاصله بسیار نزدیک به هم اتفاق بیافتد. برای این کار من قبل و بعد از ارسال پریودیک 5 ثانیه تاخیر گذاشتم ولی مشکل برطرف نشده.
    ممنون
  2. #2
    تاریخ عضویت
    2017/11/22
    نوشته ها
    364
    239
    Administrator
    اگه میتونید کدتونو بذارین تا بررسی شه.
  3. #3
    تاریخ عضویت
    2019/09/16
    نوشته ها
    49
    1
    Member
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    using System.Windows.Forms;


    namespace PeriodicAndInstanceMessageSender
    {
    public partial class Form1 : Form
    {
    public Form1()
    {
    _taskHandler = new ManualResetEvent(false);
    InitializeComponent();
    }


    private readonly ManualResetEvent _taskHandler;
    private CancellationTokenSource _cancellationTokenSource;


    private void Form1_Load(object sender, EventArgs e)
    {
    _cancellationTokenSource = new CancellationTokenSource();
    var cancellationToken = _cancellationTokenSource.Token;
    var sampleTask = new Task(PeriodicDataSendAsync, cancellationToken);


    sampleTask.Start();
    }


    private void btnSend_Click(object sender, EventArgs e)
    {

    _taskHandler.Reset(); // Stop Priodic Data Send
    Thread.Sleep(1000);
    messageTextBox.Text += "Hello!" + "\r\n";
    Task.Delay(5000);
    _taskHandler.Set(); // Start Periodic Data Send


    }


    private async void PeriodicDataSendAsync(object cancellationToken)
    {
    var token = (CancellationToken)cancellationToken;
    //await Task.Run(() =>
    //{


    while (true)
    {




    await Task.Delay(5000);


    Action action = new Action(WriteMessage);
    this.BeginInvoke(action);


    await Task.Delay(5000);




    }
    //});


    }
    private void WriteMessage()
    {
    messageTextBox.Text += "Hello!" + "\r\n";


    }
    }
    }
  4. #4
    تاریخ عضویت
    2019/09/16
    نوشته ها
    49
    1
    Member
    سلام کد رو فرستادم
    فایل حالت چند فرمی رو هم میفرستم
    مواردی که کد من مشکل داره اینا هستند
    نیاز به توقف ارسال پریودیک با بستن فرم ( در حالت چند فرمی با وجود بسته شدن فرم متد async اجرا میشود و اگر messageBox.show استفاده کنیم در فرم های دیگه پیام نمایش داده میشود)
    نیاز به شروع ارسال پریودیک فقط پس از کلیک دکمه send (با اجرای فرم قبل از زدن دکمه هم ارسال پریودیک انجام میشود)
    لطفا یک متد پریودیک دیگه هم (علاوه بر این متد) به صورت async تعریف کنید که هر دو متد همیشه اجرا شوند با این تفاوت که این متد با بالا آمدن فرم خود به خود اجرا شود نه با کلیک دکمه ای
    ممنون
  5. #5
    تاریخ عضویت
    2019/09/16
    نوشته ها
    49
    1
    Member
    نقل قول نوشته اصلی توسط AmRo نمایش پست ها
    اگه میتونید کدتونو بذارین تا بررسی شه.
    سلام،
    هنوز مشکل ارسال پریودیک قبل از کلیک کردن باتن پابرجاست. ارسال پریودیک باید بعد از کلیک باتن استارت بخوره.
    ممنون
  6. #6
    تاریخ عضویت
    2017/11/22
    نوشته ها
    364
    239
    Administrator
    کد مربوط به فرم لود و دکمه رو به این شکل تغییر بدین:
    کد:
    private bool _isPeriodicTaskStarted;
    
    
    private void ControlMode_Load(object sender, EventArgs e)
    {
       
    }
    
    
    private async void btnSend_Click(object sender, EventArgs e)
    {
    if (_isSerialPortBusy)
    await Task.Delay(1000);
    
    
    messageTextBox.Text += "[BUTTON]Hello!\r\n";
    
    
    if (!_isPeriodicTaskStarted)
    {
    _cancellationTokenSource = new CancellationTokenSource();
    var cancellationToken = _cancellationTokenSource.Token;
    var sampleTask = new Task(PeriodicDataSendAsync, cancellationToken);
    
    
    sampleTask.Start();
    _isPeriodicTaskStarted = true;
    }
    }
  7. #7
    تاریخ عضویت
    2019/09/16
    نوشته ها
    49
    1
    Member
    protected override void OnClosing(CancelEventArgs e) vs protected override void OnFormClosing(FormClosingEventArgs e)؟
  8. #8
    تاریخ عضویت
    2017/11/22
    نوشته ها
    364
    239
    Administrator
    protected override void OnClosing(CancelEventArgs e)
  9. #9
    تاریخ عضویت
    2019/09/16
    نوشته ها
    49
    1
    Member
    نقل قول نوشته اصلی توسط AmRo نمایش پست ها
    کد مربوط به فرم لود و دکمه رو به این شکل تغییر بدین:
    کد:
     private bool _isPeriodicTaskStarted; private void ControlMode_Load(object sender, EventArgs e) { } private async void btnSend_Click(object sender, EventArgs e) { if (_isSerialPortBusy) await Task.Delay(1000); messageTextBox.Text += "[BUTTON]Hello!\r\n"; if (!_isPeriodicTaskStarted) { _cancellationTokenSource = new CancellationTokenSource(); var cancellationToken = _cancellationTokenSource.Token; var sampleTask = new Task(PeriodicDataSendAsync, cancellationToken); sampleTask.Start(); _isPeriodicTaskStarted = true; } }
    شرط if (_isSerialPortBusy) اصلا اجرا نمیشه من توی شرط از messageBox استفاده کردم تا چک کنم وارد شرط میشه یا نه دیدم اصلا وارد شرط نمیشه
  10. #10
    تاریخ عضویت
    2017/11/22
    نوشته ها
    364
    239
    Administrator
    تو اون مثالی که به من داده بودین تست کردین یا ... واقعا به سریال پورت پیام میفرستادین؟
صفحه 1 از 2 12 آخرین
نمایش نتایج: از 1 به 10 از 11

کلمات کلیدی این موضوع

مجوز های ارسال و ویرایش

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