C# 如果值位于另一个线程中,如何设置属性

C# 如果值位于另一个线程中,如何设置属性,c#,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.Star

我想设置一个属性,其中值位于另一个线程中

[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;

}
[DllExport]
公共静态布尔值()
{
布尔值=假;
线程线程=新线程(异步()=>val=wait-getVal());
thread.IsBackground=true;
SetApartmentState(ApartmentState.STA);
thread.Start();
返回val;
}
公共异步任务getVal()
{
布尔值=假;
等待任务。工厂。开始新建(()=>
{
string rs=new WebClient().DownloadString(url);
如果(rs=“1”)
值=真;
其他的
值=假;
});
返回值;
}
它总是返回
false
为什么我在静态[DLLExport]方法中使用wait,否则表单将冻结


编辑:我不能在DllExport方法中使用async

那么,启动线程实际上不会告诉您代码何时运行

调用.Start()后,您会告诉线程运行其代码,但您无法真正控制操作系统何时决定让代码运行

我也不确定在另一个线程范围内使用本地定义的变量实际上是如何工作的,但是我发现很难想象你能像你正在尝试的那样设置这个值


尝试用谷歌搜索Monitor.Wait()、Monitor.Pulse(),它可以让一个线程等待另一个线程完成(一个调用Monitor.Wait(),另一个调用Monitor.Pulse(),当它希望等待的线程开始执行时)。

什么是
getVal()
?你能准备一下吗?我们将试着看看冻结或总是
false
。你根本不需要线程。
getVal()
做什么?如果它返回一个
任务
,它很可能已经在后台运行了。顺便问一下,这个
Value()
方法首先有什么意义?删除不需要的线程后,它与
bool Value(){getVal();return false;}
没有什么不同。即使是原始代码也不会在返回
false
之前等待任何内容完成。您可能应该将调用
Value()
的任何代码更改为
var val=await getValue()
@MongZhu不,你不能使[DLLExport]静态方法不异步。你似乎有两个相互竞争的需求。a) 它必须是同步的,因为它是
DllExport
。b) 它不能同步,因为它冻结了UI。我想不出解决这个问题的办法。@serman0我很想看到最终的解决办法,因为我不知道这会有什么帮助。