我正在创建一个任务,然后分配一个等待任务完成的线程,然后修改UI。
string txt = txtHelloMessage.Text;
HelloTask = Task<string>.Factory.StartNew(
() =>
{
string msg = client.SayHello(txt);
return msg;
}
);
new Thread(
() =>
{
while (true)// waiting for completion, I think that this is wrong
{
if (HelloTask.IsCompleted)
{
this.Dispatcher.Invoke((Action)delegate() { txtHelloMessage.Text = HelloTask.Result; });
break;
}
}
}
).Start();
这是好习惯吗?
答案 0 :(得分:2)
由于您使用的是.NET 4.5 / C#5,因此可以使用await
关键字。这是一个非常愚蠢的简单例子:
private async void button1_Click(object sender, EventArgs e)
{
await GetSomeTextForSomeReason();
}
private async Task GetSomeTextForSomeReason()
{
var s = await Task.Factory.StartNew(() =>
{
for (int i = 0; i < 500000000; i++) ; // simulate a delay
return "This is text";
});
textBox1.Text = s;
}
答案 1 :(得分:1)
不,这不是好习惯。
您正在使用非常繁重且昂贵的线程来处理轻量级(廉价)任务的结果。
在这种情况下,您可以让Task本身执行Invoke(),或使用continuation。
但是代码看起来非常人为,可能会发布更贴近您真实问题的内容。