Task 的问题

spmzfz 2018-06-03 10:24:17

private void button2_Click (object sender, EventArgs e)
{
Task T = Task.Run(() =>
{
DialogResult dr = MessageBox.Show("你确定要。。。。?","提示", MessageBoxButtons.OKCancel );
if(dr == DialogResult.OK )
{
SetText(textBox1, "99");

//in here add other code....
}
});
T.Wait();
//add other code .
}
//=============================================================================
private delegate void SetTextCallback(System.Windows.Forms.Control control, string text);
private static void SetText(System.Windows.Forms.Control control, string text)
{
if (control.InvokeRequired)
{
SetTextCallback d = new SetTextCallback(SetText);
control.Invoke(d, new object[] { control, text });
}
else
{
control.Text = text;
}
}


问题:假若有这样的代码,我想使用Task同时我想在T 完成后再执行后面的代码,所以我使用.Wait();但是这样的话程序一直卡在 T.Wait();我知道是因为代码中使用了委托的缘故,请问有办法解决么?
...全文
323 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
button2_Click 中并没有什么阻塞,它根本不等 MessageBox.Show 执行完毕,甚至根本不等开始,事件处理程序就结束了。这才是异步子线程执行机制。 阻塞、死循环,是荒唐的没有搞懂异步子线程机制的。既然你要阻塞,那么你何必用 Task 呢? 所以毫无阻塞和循环,这才是异步多线程编程设计是知识点。
  • 打赏
  • 举报
回复
弄一个线程(.net 越来越丰富,所以这里把携程,Task之类的也叫做线程),然后阻塞它,其实这个很荒唐的了。只不过为了演示个别语法,可以这样写。如果你真正从设计出发,那么自然就会怀疑这种代码到底是有意义的还是无意义的。 一个 Task 是用来处理异步编程的,例如
using System;
using System.Net;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            Task.Run(async () =>
            {
                var 内容 = await GetContent("");
                Console.WriteLine("获取到的内容有 {0} 个字符。", 内容.Length);
            });
            Console.WriteLine("..................按任意键结束");
            Console.ReadKey();
        }

        private static async Task<string> GetContent(string v)
        {
            var s = new WebClient().DownloadData("https://bbs.csdn.net/topics/392391014");
            return Encoding.UTF8.GetString(s);
        }
    }
}
假设根本没有异步概念,那么满脑子就只有“阻塞、while循环”这类东西了。
  • 打赏
  • 举报
回复
所谓“任务执行之后再执行其它代码”,例如将上述内容用一个 html 解析器来过滤一下边所有的回帖中包含多少个作者,那么就需要写到
    Task.Run(async () =>
    {
        var c = await GetContent("");
        Console.WriteLine("获取到的内容有 {0} 个字符。", c.Length);
        进行分析(c);
    });
这是异步的概念,也就是说是一件事完成了,那么那个线程接着做下面的事情。 而你说的“我想在T 完成后再执行后面的代码”则根本不是异步线程概念,你这个是阻塞概念。

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧