【发布时间】:2015-07-31 00:29:48
【问题描述】:
我有一个初始表单的应用程序,该表单具有各种配置(复选框、文本框、滑块/轨迹栏)。当我启动使用这些配置的操作时,会调用一个工作进程:
private void btnx_Click(object sender, EventArgs e)
{
bgWorkerX.RunWorkerAsync();
}
private void bgWorkerX_DoWork(object sender, DoWorkEventArgs e)
{
Dictionary<string, object> dictCfgOut = GenerateConfigDict();
XGen.CreateX.aReadFile(inputPathXRAW.Text, outputPathX.Text, dictCfgOut);
}
GenerateConfigDict 函数创建一个Dictionary<string, object> 的配置数据。这是因为所需的数据不同(一些布尔值、一些整数、一个字符串数组)。创建它的代码如下:
private Dictionary<string, object> GenerateConfigDict()
{
Dictionary<string, object> ConfigDict = new Dictionary<string, object>();
if (cbXAddOnus.Checked)
{
if (!MiscTools.ValidateX(txtInstX.Text, true))
return null;
}
ConfigDict.Add("Available Images", GenerateConfigImageArray());
ConfigDict.Add("X SCSC Hot", (cbXAddSCSC.Checked) ? (bool)true : (bool)false);
ConfigDict.Add("X Req Adj", (cbXAddAdjustment.Checked) ? (bool)true : (bool)false);
ConfigDict.Add("X Items", (cbXAddX.Checked) ? (bool)true : (bool)false);
ConfigDict.Add("X Use Something", (cbXAddX.Checked) ? (bool)true : (bool)false);
ConfigDict.Add("X Somedata", (string)txtX.Text);
ConfigDict.Add("X Use SAN", (cbX.Checked) ? (bool)true : (bool)false);
ConfigDict.Add("X % Y", (int)sliderX.Value);
return ConfigDict;
}
sliderX.Value 部分是今天刚刚添加的。在此之前,一切都很好。然而,只有这一点,我得到:
跨线程操作无效:控件“sliderX”从 线程不是创建它的线程。
首先,为什么读取该值不是线程安全的,但读取复选框和文本是?其次,我一直在讨论如何使该线程安全,但这似乎都需要另一个函数来异步调用该值。我已经采取措施确保在工作人员运行时禁用滑块,因此无法从表单进行更改。
谢谢!
【问题讨论】:
标签: c# winforms thread-safety trackbar