簡體   English   中英

如何在下面的按鈕中使用 Thread

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM