C# Xamarin Android自定义线程类块UI

C# Xamarin Android自定义线程类块UI,c#,android,multithreading,xamarin,C#,Android,Multithreading,Xamarin,我试图创建一个自定义线程类,但当我调用它的函数时,它会阻塞我的UI线程。我的意思是,当我按下按钮时,它会一直按下直到任务完成 这是主要活动: using Android.App; using Android.Widget; using Android.OS; using Java.Lang; namespace ThreadTest08 { [Activity(Label = "ThreadTest08", MainLauncher = true, Icon = "@drawable/

我试图创建一个自定义线程类,但当我调用它的函数时,它会阻塞我的UI线程。我的意思是,当我按下按钮时,它会一直按下直到任务完成

这是主要活动:

using Android.App;
using Android.Widget;
using Android.OS;
using Java.Lang;

namespace ThreadTest08 {
    [Activity(Label = "ThreadTest08", MainLauncher = true, Icon = "@drawable/icon")]
    public class MainActivity : Activity {

        protected override void OnCreate(Bundle bundle) {
            base.OnCreate(bundle);

            SetContentView(Resource.Layout.Main);
            Button button = FindViewById<Button>(Resource.Id.MyButton);

            button.Click += delegate {
                MyThreadClass mtc = new MyThreadClass();
                mtc.Start();
                mtc.DoSomething();    
            };    
        }
    }
}

为什么会这样?感谢阅读。

Thread.Sleep在使用几乎所有的UI框架(WinForms/WPF/Xamarin.Forms/Silverlight/…)时都应该避免,因为它会冻结UI线程并挂起UI

如果您想等待

异步:等待任务。延迟(10000)

同步:Task.Delay(10000.Wait()

但请尽量避免阻塞UI线程,以确保良好的用户体验并保持应用程序的响应性

使用Thread.Sleep在Xamarin.Forms中

有两个Xamarin.Forms模板:

表单可移植类库

由于PCL子集机制,您没有机会获得Thread.Sleep。 表单共享项目

此模板包含不支持Thread.Sleep的不同平台。Windows UWP、Xamarin.Android和Xamarin.iOS支持,Windows Phone 8.1和Windows 8.1不支持。如果卸载/删除这两个项目,将生成解决方案。(不要忘记在App.cs中使用System.Threading)

编辑: UI线程冻结,因为自定义线程使UI线程等待。在自定义线程中执行的操作在UI线程上运行


您可以使用方法来执行注释中显示的代码。我认为这将满足您的需要。

您可以按照以下代码进行操作

button.Click += MyButtonClick;

private async void MyButtonClick(object sender, EventArgs e)
{
    button.Text="Working";
    await Task.Run(async () =>
    {
        await Task.Delay(3000); //or whatever you need
         Device.BeginInvokeOnMainThread(() => {
           button.Text="Done";
         });

    });
}

嗨,谢谢你的回复。实际上,这是我正在编写的代码的精简版本。“Thread.Sleep(x)”只是用来表示一些任务的执行,在我当前的项目中包含蓝牙通信。即使我键入如下内容:
public void DoSomething(){for(int I=0;I)你会问为什么UI会冻结,那是因为你使用了线程。睡眠(x)你正在执行的线程,我想它在UI线程上工作。嗨,我想把这个添加到这一部分,因为我认为它是相关的。我使用代码中的“使用Java.Lang;”是因为它允许我创建一个继承自Thread类的类“那么代码不会编译,说线程是一个密封的类。既然Java.lang允许在Thread类上继承,有没有办法阻止继承的线程在UI上运行并锁定它?如果你的问题得到了回答,请接受这个答案。很抱歉,所有答案都离题了,我无法接受。因为”MyThreadClass“从“线程”继承为什么它的行为不像线程?
button.Click += MyButtonClick;

private async void MyButtonClick(object sender, EventArgs e)
{
    button.Text="Working";
    await Task.Run(async () =>
    {
        await Task.Delay(3000); //or whatever you need
         Device.BeginInvokeOnMainThread(() => {
           button.Text="Done";
         });

    });
}