Từ những gì tôi đã tìm thấy trong C#, phương thức Control.Invoke yêu cầu bạn sử dụng một đại biểu không có tham số đầu vào. Có cách nào để khắc phục điều này? Tôi muốn gọi một phương thức để cập nhật giao diện người dùng từ một luồng khác và chuyển đến các tham số chuỗi cho nó.Control.Invoke với tham số đầu vào
Trả lời
Bạn đang sử dụng phiên bản C# nào? Nếu bạn đang sử dụng C# 3.5, bạn có thể sử dụng các bao đóng để tránh truyền các thông số.
Với C# 3,5public static class ControlExtensions
{
public static TResult InvokeEx<TControl, TResult>(this TControl control,
Func<TControl, TResult> func)
where TControl : Control
{
return control.InvokeRequired
? (TResult)control.Invoke(func, control)
: func(control);
}
public static void InvokeEx<TControl>(this TControl control,
Action<TControl> func)
where TControl : Control
{
control.InvokeEx(c => { func(c); return c; });
}
public static void InvokeEx<TControl>(this TControl control, Action action)
where TControl : Control
{
control.InvokeEx(c => action());
}
}
an toàn cách gọi mã bây giờ trở nên tầm thường.
this.InvokeEx(f => f.label1.Text = "Hello World");
this.InvokeEx(f => this.label1.Text = GetLabelText("HELLO_WORLD", var1));
this.InvokeEx(() => this.label1.Text = DateTime.Now.ToString());
Với C# 2.0 nó trở nên ít tầm thường
public class MyForm : Form
{
private delegate void UpdateControlTextCallback(Control control, string text);
public void UpdateControlText(Control control, string text)
{
if (control.InvokeRequired)
{
control.Invoke(new UpdateControlTextCallback(UpdateControlText), control, text);
}
else
{
control.Text = text;
}
}
}
Sử dụng nó đơn giản, nhưng bạn phải xác định hơn callbacks cho các thông số hơn.
this.UpdateControlText(label1, "Hello world");
Tôi nghĩ (xuất sắc) Cách tiếp cận của Samuel có thể được đẩy thậm chí nhiều hơn:
Phương pháp mở rộng: Mã
public static void ExecuteAsync<TControl>(this TControl control, Action action)
where TControl : Control
{
new Thread(() =>
{
control.Invoke(action);
})
.Start();
}
Mẫu:
private void doStuff()
{
this.ExecuteAsync(() =>
{
// Do your stuff in a separate thread
// but having full access to local or instance variables.
// No (visible) threading code needs to be used here.
});
}
Như Luke nói, sử dụng Control.I nvoke như thế này ...
Ví dụ trong một hình thức:
public delegate void DelegatePassMessages(string name, int value);
public DelegatePassMessages passMessage;
Trong contructor:
passMessage = new DelegatePassMessages (this.MessagesIn);
Sau đó, chức năng MessagesIn để nhận dữ liệu:
public void MessagesIn(string name, int value)
{
}
Sau đó, để chuyển dữ liệu đến biểu mẫu của bạn:
formName.Invoke(formName.passMessage, new Object[] { param1, param2});
Tìm thấy một phương thức thanh lịch cho .net 2.0 với các phương thức ẩn danh được bao bọc trong một MethodInvoker Delegate. Bằng cách đó, không cần phải định nghĩa các đại biểu riêng.Ví dụ:
private void InitUI(Guid id, string typename)
{
MethodInvoker inv = delegate{tvMatrix.Nodes[0].Nodes.Add(id.ToString(), typename);};
tvMatrix.Invoke(inv);
}
Tại sao không
tvMatrix.Invoke((MethodInvoker) (() => {
tvMatrix.Nodes[0].Nodes.Add(id.ToString(), typename);
}));
Một số chi tiết khả năng:
this.Invoke(new MethodInvoker(() => this.DoSomething(param1, param2)));
hoặc
this.Invoke(new Action(() => this.DoSomething(param1, param2)));
hoặc thậm chí
this.Invoke(new Func<YourType>(() => this.DoSomething(param1, param2)));
nơi tùy chọn đầu tiên là tùy chọn tốt nhất, vì MethodInvoker được khái niệm cho mục đích đó và có hiệu suất tốt hơn.
Ở đây, bạn sử dụng biểu thức lambda với phần mở rộng Invoke() + tham số đầu vào.
Sử dụng: hành động (STARS db)
_ccb.GetImagerFRU_PartNbr().Invoke(new Action<STARS>(dbase => _ccb.GetImagerFRU_PartNbr().Text = dbase.PartNumber(serial) ?? String.Empty), db);
private void ppTrace(string tv)
{
if (_Txb1.InvokeRequired)
{
_Txb1.Invoke((Action<string>)ppTrace, tv);
}
else
{
_Txb1.AppendText(tv + Environment.NewLine);
}
}
- 1. Tham số đầu ra với Entity Framework
- 2. python, argparse: cho phép tham số đầu vào khi một tham số khác được chỉ định
- 3. Asp.Net Mvc JQuery tham số đầu vào ajax là null
- 4. Loại datetime cho tham số đầu vào trong thủ tục
- 5. tham số truyền vào php với shell
- 6. Tò mò về việc thực hiện Control.Invoke()
- 7. Bootstrap - Đầu vào (số) với Chrome
- 8. Moq phương pháp giả với tham số ra cách xác định đầu vào
- 9. Sử dụng NHibernate với tham số đầu ra
- 10. bắt đầu ứng dụng erlang với tham số
- 11. tham số đầu tiên của os.exec *
- 12. Thuộc tính C#: Sử dụng hằng số enum làm tham số đầu vào
- 13. Đầu vào CIAreaHistogramChính sách số
- 14. Tham chiếu Mẫu có đầu vào Chuỗi
- 15. Lớp Singleton với tham số
- 16. Dấu phẩy lộn xộn với đầu vào số trong Javascript
- 17. Bộ lọc Kalman với bốn thông số đầu vào
- 18. Tham số đầu ra SQL mô phỏng
- 19. C# SQL Đầu làm tham số
- 20. trở hai tham số đầu ra sp_executesql
- 21. UIGraphicsBeginImageContext với tham số
- 22. AddressOf với tham số
- 23. Singleton với tham số
- 24. chuyển tham số vào dpkg -i?
- 25. Cách lấy tham số phụ thuộc vào tham số khác ở Hudson hoặc Jenkins
- 26. params Tham số với giá trị tham số mặc định
- 27. Render định dạng đầu ra (HTML, JSON, XML) tùy thuộc vào tham số?
- 28. Các chức năng ẩn danh không có tham số đầu vào
- 29. mustache i18n với tham số
- 30. Xử lý đường ống và tham số đầu vào trong chức năng Powershell