我想我會做的是傳遞參數值,和代表到BackgroundWorker
的列表。這樣,您可以「同步」編寫分配代碼,但延遲執行直到實際檢索值。
開始與「請求」類,它看起來是這樣的:
class ParameterUpdate
{
public ParameterUpdate(string name, string value, Action<string> callback)
{
this.Name = name;
this.Value = value;
this.Callback = callback;
}
public string Name { get; private set; }
public string Value { get; set; }
public Action<string> Callback { get; private set; }
}
然後再編寫異步代碼使用此:
private void bwUpdateParameters_DoWork(object sender, DoWorkEventArgs e)
{
var updates = (IEnumerable<ParameterUpdate>)e.Argument;
foreach (var update in updates)
{
WriteDeviceParameter(update.Name, update.Value);
update.Value = ReadDeviceParameter(update.Name);
}
e.Result = updates;
}
private void bwUpdateParameters_RunWorkerCompleted(object sender,
RunWorkerCompletedEventArgs e)
{
var updates = (IEnumerable<ParameterUpdate>)e.Argument;
foreach (var update in updates)
{
if (update.Callback != null)
{
update.Callback(update.Value);
}
}
}
這裏是你將如何揭開序幕更新。比方說,你有一堆要與中使用的參數的實際值更新成員域:
// Members of the Form/Control class
private string bandwidth;
private string inputAttenuation;
private string averaging;
// Later on, in your "update" method
var updates = new List<ParameterUpdate>
{
new ParameterUpdate("Bandwidth", "3000", v => bandwidth = v),
new ParameterUpdate("InputAttenuation", "10", v => inputAttenuation = v),
new ParameterUpdate("Averaging", "Logarithmic", v => averaging = v)
};
bwUpdateParameters.RunWorkerAsync(updates);
這就是你必須做的。所有的實際工作都是在後臺完成的,但是您正在編寫簡單的變量賦值語句,就好像它們在前臺一樣。由於實際分配在RunWorkerCompleted
事件中執行,因此代碼很短,很簡單,並且完全線程安全。
如果你需要做的不止此,比如除了變量更新的控制,這是非常簡單的,你可以把你想要的回調東西,即:
new ParameterUpdate("Bandwidth", "3000", v =>
{
bandwidth = v;
txtBandwidth.Text = v;
})
再次,這將工作因爲它在工作完成之前並沒有真正執行。
你能展示一些代碼來給我們一個更好的想法,你想要做什麼? – t0mm13b