我不知道如何解释,所以这是我的代码:
this.Invoke(listBox1.Items.Add, new Object[] { e.Data.ToString() });
Run Code Online (Sandbox Code Playgroud)
但是,如果我没有任何错误,一切都会好的,但遗憾的是我有2个错误:
错误1
'System.Windows.Forms.Control.Invoke(System.Delegate,params object [])'的最佳重载方法匹配有一些无效的参数
错误2
参数1:无法从'方法组'转换为'System.Delegate'
我该怎么做才能克服这些异常?
我看到了很多关于如何从不同线程编辑 c# 表单上的控件的问题,但对我来说没有多大意义。我知道您不能从主线程以外的其他线程更改任何 UI。为了使这项工作有效,您必须使用调用并从那里安全地编辑控件?
我有一个按钮开始写入文件,当您按下按钮时,按钮本身就会被禁用,因此您无法启动执行完全相同操作的多个线程。写入完成后,我希望按钮再次可用,但我无法让它在另一个线程上工作。
我将其作为表单中的Generate_Click 事件。
private void Generate_Click(object sender, EventArgs e)
{
Generate.Enabled = false;
int x = 512;
int y = 512;
MBrot mbrot = new MBrot(x, y);
PB_Update lb = new PB_Update(0, y, Generator_PB, Generate, mbrot, this);
lb.Start();
}
Run Code Online (Sandbox Code Playgroud)
这是 PB_Update.cs 中的 ThreadWork() 函数,当 while 循环完成时,对文件的写入完成,线程也完成,因此它结束并给出一个带有“finished”的消息框,现在作为最后一个按钮需要再次启用。
public void ThreadWork()
{
while (true)
{
if (currValue_ >= maxValue_)
break;
ThreadTick();
}
mb_.StopBrot();
t_.Interrupt();
MessageBox.Show("Finished!");
Generate_.Enabled = true;
}
Run Code Online (Sandbox Code Playgroud) 好吧,所以我在这里遇到了一些问题.这是循环.
lock (ClientLocker)
{
Trace.WriteLine("#WriteAll: " + sm.Header);
foreach (Client c in Clients)
{
if (c.LoggedIn)
{
Trace.WriteLine("#TryWriteTo[" + c.Id + "](" + sm.Header + ")");
LazyAsync.Invoke(() => c.WriteMessage(sm));
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是LazyAsync
public static class LazyAsync
{
public static void Invoke(Action a)
{
a.BeginInvoke(a.EndInvoke, null);
}
}
Run Code Online (Sandbox Code Playgroud)
每个Client包含一个socket,所以我不能Clone这么做.问题是,当我执行Invoketo时c.WriteMessage,由于执行被延迟,它通常不会触发列表中的第一对,并且有时实际上只会在最后一项上触发一大堆.
我知道这与c是一个在Invoke实际被调用之前发生变化的引用有关,但有没有办法避免这种情况?
执行一般for(int i=0 etc循环似乎无法解决此问题.
任何人对我如何解决这个问题都有任何想法?
记住,不能Clone Client.
假设我有一个类A,它有自己的实例变量.它有一个名为的方法doSomething(),它是一种static方法.现在,A添加另一个类B作为一些指针.在课堂上说B,我运行一些逻辑,并确定我需要运行包含在其中的代码doSomething().我可以这么说A.doSomething()吗?如果我有一个实例A叫a,确实a的doSomething()方法被调用?
我有这个问题...
有什么好的解决方案?
private void button1_Click(object sender, EventArgs e)
{
aTimer.Enabled = true;
button1.Enabled = false;
}
private void button2_Click(object sender, EventArgs e)
{
aTimer.Enabled = false;
}
private void timer_is_working(object source, ElapsedEventArgs e)
{
aTimer.Enabled = false;
button1.Enabled = true;
}
Run Code Online (Sandbox Code Playgroud)
谢谢!此致Daniel Ruescher
我System.Windows.Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Input, new Action(() => ...用于wpf图形刷新.
它非常适用于我的其他功能,但是在我的SQL删除功能中,它会被触发/执行.
我试了一下,System.Windows.Forms.Application.DoEvents();但它做了什么.
Set_Loading_Changed()
{
System.Windows.Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Input, new Action(() =>
{
if (BLoading)
{
TextBox_Warten.Margin = new Thickness(ComboBox_Such_Optionen.Margin.Left, ComboBox_Such_Optionen.Margin.Top, Btn_Suchen.Margin.Right, Btn_Suchen.Margin.Bottom);
DataGrid_Anzeige.IsEnabled = false;
foreach (System.Windows.Controls.TextBox TextBox_Temp in Grid_Mw.Children.OfType<System.Windows.Controls.TextBox>().Where(x => !x.Name.Contains("TextBox_Warten")))
{
TextBox_Temp.IsEnabled = false;
}
foreach (System.Windows.Controls.Button Btn_Temp in Grid_Mw.Children.OfType<System.Windows.Controls.Button>())
{
Btn_Temp.IsEnabled = false;
}
foreach (System.Windows.Controls.ComboBox ComboBox_Temp in Grid_Mw.Children.OfType<System.Windows.Controls.ComboBox>())
{
ComboBox_Temp.IsEnabled = false;
}
Mouse.OverrideCursor = System.Windows.Input.Cursors.Wait;
}
else
{
DataGrid_Anzeige.IsEnabled = true;
DataGrid_Anzeige.Opacity = 100;
TextBox_Warten.Margin = new Thickness(-TextBox_Warten.Width - …Run Code Online (Sandbox Code Playgroud) 我在创建静态void Main()的程序集实例时遇到问题.
Heres是程序集的代码(.NET Exe)
namespace Test
{
internal static class Program
{
[STAThread]
private static void Main(string[] args)
Run Code Online (Sandbox Code Playgroud)
这是启动器代码:bin是一个包含从文件读取的程序集的字节数组.
Assembly asm = Assembly.Load(bin);
MethodInfo method = asm.EntryPoint;
object obj = asm.CreateInstance(method.ToString());
method.Invoke(obj, null);
Run Code Online (Sandbox Code Playgroud)
由于参数不匹配,obj始终为null并且Invoke抛出异常.