[英]How to use Thread in the button below
當我按下按鈕時,解碼二維碼效果很好,但我想用線程來做。 我寫如下,但線程不起作用。 有誰知道,我該如何解決?
謝謝。
這是我的代碼:
private async void button2_Click(object sender, EventArgs e)
{
await Task.Run(() =>
{
pictureBox1.Image = Image.FromFile(@"C:\Users...\1.jpg");
MessagingToolkit.QRCode.Codec.QRCodeDecoder decoder = new MessagingToolkit.QRCode.Codec.QRCodeDecoder();
textBox2.Text = decoder.Decode(new QRCodeBitmapImage(pictureBox1.Image as Bitmap));
});
}
這將使您的 UI 保持響應
private async void button2_Click(object sender, EventArgs e)
{
var Result = await Decode("Image Path");
textBox2.Text = Result;
}
private async Task<string> Decode(string PathOfImage)
{
var DecodedText = string.Empty;
var decoder = new MessagingToolkit.QRCode.Codec.QRCodeDecoder();
await Task.Run(() =>
{
DecodedText = decoder.Decode(new QRCodeBitmapImage(Image.FromFile(PathOfImage) as Bitmap));
});
return DecodedText;
}
更新 2:您可以在一個 function 中做到這一點:
private async void button2_Click(object sender, EventArgs e)
{
var DecodedText = string.Empty;
var decoder = new MessagingToolkit.QRCode.Codec.QRCodeDecoder();
await Task.Run(() => {
DecodedText = decoder.Decode(new QRCodeBitmapImage(Image.FromFile(PathOfImage) as Bitmap));
});
textBox2.Text = DecodedText;
}
您應該在Task
完成后更新TextBox
,此時您將返回 UI 線程。
private async void button2_Click(object sender, EventArgs e)
{
var bitmap = await Task.Run(() =>
{
return (Bitmap)Image.FromFile(@"C:\Users...\1.jpg");
});
pictureBox1.Image = bitmap;
var result = await Task.Run(() =>
{
var decoder = new MessagingToolkit.QRCode.Codec.QRCodeDecoder();
return decoder.Decode(new QRCodeBitmapImage(bitmap));
});
textBox2.Text = result;
}
更新:更新PictureBox
的代碼也應該移出Task.Run
主體。
更新:圖像的加載也會阻塞 UI,所以我將它移到了單獨的Task
中。
調度程序 object 用於從線程或任務修改 UI
下面如何使用任務
方法一
bool result ;
Task<bool> task = Task.Run<bool>(async () => await RefreshUIAsync());
str = task.Result;
public async Task<bool> RefreshUIAsync()
{
bool result;
result= await Task.Factory.StartNew(() => RefreshUI());
return result;
}
private string RefreshUI()
{
bool result;
try
{
this.Dispatcher.BeginInvoke(DispatcherPriority.Normal, (ThreadStart)delegate()
{
string ImagePath="";
pictureBox1.Image = Image.FromFile(ImagePath);
.......
});
result=true;
}
catch (Exception ex)
{
result=false;
}
return result;
}
方法二
RefreshUIAsync().Wait();
public async Task RefreshUIAsync()
{
await Task.Run(() => {
This.Dispatcher.BeginInvoke(DispatcherPriority.Normal, (ThreadStart)delegate()
{
string ImagePath="";
pictureBox1.Image = Image.FromFile(ImagePath);
.......
});
});
}
以及下面如何使用線程
方法一
myThread = new Thread(() => ThreaRefreshUI());
myThread.Start();
private void ThreaRefreshUI()
{
try
{
this.Dispatcher.BeginInvoke(DispatcherPriority.Normal, (ThreadStart)delegate()
{
string ImagePath="";
pictureBox1.Image = Image.FromFile(ImagePath);
.......
});
}
catch (Exception ex)
{
}
}
方法二
Thread thread = new Thread(new ThreadStart(ThreaRefreshUI));
thread.Start();
public void ThreaRefreshUI()
{
try
{
this.Dispatcher.BeginInvoke(DispatcherPriority.Normal, (ThreadStart)delegate()
{
string ImagePath="";
pictureBox1.Image = Image.FromFile(ImagePath);
.......
});
}
catch (Exception ex)
{
}
}
方法三
Thread thread = new Thread(ThreaRefreshUI);
thread.Start();
public void ThreaRefreshUI()
{
try
{
this.Dispatcher.BeginInvoke(DispatcherPriority.Normal, (ThreadStart)delegate()
{
string ImagePath="";
pictureBox1.Image = Image.FromFile(ImagePath);
.......
});
}
catch (Exception ex)
{
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.