c# - 如果值在另一个线程中,如何设置属性
问题描述
我想设置一个值在另一个线程中的属性
[DllExport]
public static bool Value()
{
bool val = false;
Thread thread = new Thread(async () => val = await getVal());
thread.IsBackground = true;
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
return val;
}
public async Task<bool> getVal()
{
bool value = false;
await Task.Factory.StartNew(() =>
{
string rs = new WebClient().DownloadString(url);
if (rs == "1")
value = true;
else
value = false;
});
return value;
}
它总是返回false
为什么我使用那个我不能在静态 [DLLExport] 方法中使用等待,否则表单将冻结。
编辑:我不能在 DllExport 方法中使用异步
解决方案
好吧,启动线程确实不会告诉您代码何时运行。
调用 .Start() 后,您告诉线程运行其代码,但您无法真正控制操作系统何时决定实际让代码运行。
我也不确定在另一个线程范围内使用本地定义的变量实际上是如何工作的,但我发现很难想象你可以像你试图做的那样设置值。
尝试谷歌搜索 Monitor.Wait(), Monitor.Pulse() 可用于让一个线程等待另一个线程完成(一个调用 Monitor.Wait() ,另一个调用 Monitor.Pulse() 当它想要等待线程时开始执行)。
推荐阅读
- react-native - 在本机反应中根据视图高度更改页脚样式
- java - 无法将文件写入 Documents 文件夹
- kubernetes - 为什么使用 kubernetes yaml 文件无法重现 podman pod?
- javascript - 无需用户交互即可将文件 url 链接复制到剪贴板的 Javascript
- javascript - 如果没有匹配的累加器,RxJS 如何减少?
- javascript - Reactjs - 使用功能组件在应用程序启动时调用函数
- ios - 代理背后的 XCode Swift 包管理器错误
- json - JSONSchema 本身是否有 JSONSchema?
- c++ - 为什么不能将字符串的一部分传递给 atoi 或 stoi?
- django - 无法在 django 和 selenium docker 容器之间进行通信