当前位置:首页 » 密码管理 » 跨线程ui访问

跨线程ui访问

发布时间: 2023-10-24 22:57:11

A. wpf中 我新开一个线程添加控件到主窗体

wpf中使用Dispatcher类控制线程, 当异步操作完成后, 可以调用
Dispatcher.BeginInvoke(DispatcherPriority.Normal, (Action)(() => { //to do sth })); 返回UI线程

B. Android系统为什么不允许在线程中访问UI

UI线程及Android的单线程模型原则当应用启动,系统会创建一个主线程(main thread)。这个主线程负责向UI组件分发事件(包括绘制事件),也是在这个主线程里,应用和Android的UI组件(components from the Android UI toolkit (components from the android.widget and android.view packages))发生交互。

当App做一些比较重(intensive)的工作的时候,除非合理地实现,否则单线程模型的performance会很poor。特别的是,如果所有的工作都在UI线程,做一些比较耗时的工作比如访问网络或者数据库查询,都会阻塞UI线程,导致事件停止分发(包括绘制事件)。对于用户来说,应用看起来像是卡住了,更坏的情况是,如果UI线程blocked的时间太长(大约超过5秒),用户就会看到ANR(application not responding)的对话框。

另外,Andoid UI toolkit并不是线程安全的,所以不能从非UI线程来操纵UI组件。必须把所有的UI操作放在UI线程里,所以Android的单线程模型有两条原则:
1.不要阻塞UI线程。
2.不要在UI线程之外访问Android UI toolkit(主要是这两个包中的组件:android.widget and android.view)。

C. WPF跨线程遍历访问容器内的控件

this.Dispatcher.Invoke(new Action(() =>{
//TODO:更新UI控件操作
}));

D. unity c#跨线程调用怎么实现

在unity里边使用多线程做一些事情是非常好的,比如解压资源 更新资源等。因为单开线程的话 不会影响主线程卡顿,这样UI就不会卡了。但是开的线程里边不能执行unity主线程的mono代码。线程启动后,执行完毕自动结束该线程、可以同时启动多个线程做事。
代码如下: using System.Threading;
void StartThread()
{

Thread athread = new Thread(new ThreadStart(goThread));
athread.IsBackground = true;//防止后台现成。相反需要后台线程就设为false

athread.Start();
}
void Awake()
{
StartThread();
}
object lockd = new object();
void goThread()
{
int index = 0;
while (true)
{
lock (lockd)//防止其他线程访问当前线程使用的数据
{
Debug.Log("in thread" + index);
index++;
if (index == 100)
{
Thread.Sleep(10000);// 将当前线程挂起指定的时间 毫秒 时间结束后 继续执行下一步 和yield类似
}
else if (index == 200)
{
break;//该函数执行完自动结束该线程
}
}
}
}

所以其实多线程和协程原理差别很大的,只是功能有点类似。

1、当在主线程中创建了一个线程,那么该线程的IsBackground默认是设置为FALSE的。
2、当主线程退出的时候,IsBackground=FALSE的线程还会继续执行下去,直到线程执行结束。
3、只有IsBackground=TRUE的线程才会随着主线程的退出而退出
---------------------------------------------------------------------------------------------

ThreadStart:
Thread athread = new Thread(new ThreadStart(goThread));
athread.Start();//该方法启动的多线程 不能带有参数。

ParameterThreadStart:

ParameterThreadStart的定义为void ParameterizedThreadStart(object state),使用这个这个委托定义的线程的启动函数可以接受一个输入参数,具体例子如下 :
[csharp] view plain
ParameterizedThreadStart threadStart=new ParameterizedThreadStart(Calculate)
Thread thread=new Thread() ;
thread.Start(0.9);//参数是0.9
public void Calculate(object arg)//arg参数是0.9
{
double Diameter=double(arg);
Console.Write("The Area Of Circle with a Diameter of {0} is {1}"Diameter,Diameter*Math.PI);
}
Calculate方法只有一个为object类型的参数。需要传多个参数的时候 需要把参数都塞进object 然后进行转换。比如:

一个参数 void BuildA(object para){ List<int> list=para as List<int>;...}
BuildA(list);
多个参数 void BuildB(object para){ object[] ps= para as object[];List<int> list=ps[0] as as List<int>;GameObject b=ps[1] as GameObject;...}
BuildB(new object[]{list,obj});//把多个参数塞到object数组里边 传过去,相当于只传一个参数。

至于是开一个线程还是多个线程 根据需求和内核数SystemInfo.processorCount来确定。最好一个核开一个线程 会快点。
详见bundleglobal.cs和sdFileSystem.cs/sdMultiThread.cs

热点内容
奇骏哪个配置性价比 发布:2024-11-29 22:25:21 浏览:702
汉娜数据库 发布:2024-11-29 22:25:17 浏览:703
服务器和收银机怎么连接 发布:2024-11-29 22:24:11 浏览:608
关键词排名源码 发布:2024-11-29 22:22:03 浏览:72
禅道服务器ip是什么 发布:2024-11-29 22:22:02 浏览:808
参贪心算法 发布:2024-11-29 21:54:24 浏览:340
php统计数组元素 发布:2024-11-29 21:46:08 浏览:195
健康和解压哪个重要 发布:2024-11-29 21:40:07 浏览:749
联通网的密码去哪里找 发布:2024-11-29 21:38:57 浏览:849
jscookie加密 发布:2024-11-29 21:33:03 浏览:40