【问题标题】:How to access the task status runnning in a button clicking event from the other button clicking event如何从另一个按钮单击事件访问在按钮单击事件中运行的任务状态
【发布时间】:2020-06-22 22:37:24
【问题描述】:

我想通过单击其他按钮来了解 A 按钮事件中运行的任务状态。 像这样。

private void button1_Click(object sender, EventArgs e)
{
Task.Run(()=>{
//The method to take long time
//For example
Thread.Sleep(5000)
;});
}
private coid button2_Click(object sender, EventArgs e)
{
//until 5000ms
//the method to know the above task status (Runnning....)

//after 5000ms
//the method to know the above task status (Conpleted....)

}

【问题讨论】:

  • 获取Task 的状态并不是真正的挑战。从 Fayilt 的回答中可以看出,您所需要的只是对 Task 对象的引用。您想如何处理在执行Task 期间多次单击Button1 的用例。将创建多个Task 对象,并且引用将指向最后一个。

标签: c# multithreading task


【解决方案1】:

目前还不完全清楚你想要实现什么,但是如果你想检查任务的状态,你可以在调用 Task.Run() 时得到它的引用

private Task _task;

private void button1_Click(object sender, EventArgs e)
{
     _task = Task.Run(() => Thread.Sleep(5000));
}

private void button2_Click(object sender, EventArgs e)
{
    if (_task?.Status == TaskStatus.RanToCompletion)
        //do something
}

答案和问题一样含糊不清,所以如果你能给我更多的细节,我可以想出一个更好、更有针对性的答案。

【讨论】:

    【解决方案2】:

    同样,您在此处查找的内容非常不清楚...但这是 Faylit 示例的扩展版本:

    public partial class Form1 : Form
    {
    
        public Form1()
        {
            InitializeComponent();
        }
    
        private Task T = null;
    
        private void Form1_Load(object sender, EventArgs e)
        {
            updateStatus();
        }
    
        private async void button1_Click(object sender, EventArgs e)
        {            
            button1.Enabled = false;
    
            await (T = Task.Run(() =>
             {
                 updateStatus();
                 System.Threading.Thread.Sleep(5000);
             }));            
    
            button1.Enabled = true;
            updateStatus();
        }
    
        private void button2_Click(object sender, EventArgs e)
        {
            updateStatus();
        }
    
        private void updateStatus()
        {
            if (label1.InvokeRequired)
            {
                label1.Invoke((MethodInvoker)delegate 
                {
                    updateStatus();
                });
            }
            else
            {
                if (T == null)
                {
                    label1.Text = "Task not started.";
                }
                else if (!T.IsCompleted)
                {
                    label1.Text = "Task running...";
                }
                else
                {
                    label1.Text = "Task completed.";
                }
            }            
        }
    
    }
    

    它可能会给你更多的想法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-03
      • 1970-01-01
      • 1970-01-01
      • 2011-11-23
      • 2014-06-28
      • 2014-04-24
      • 1970-01-01
      相关资源
      最近更新 更多