问候,我正在用C#开发一些应用程序.目前我正在处理线程,我有一个问题,我在脑海里.Invoke和BeginInvoke有什么区别?我读了一些帖子,我在这里找到了一些有用的信息:这里
但是,以下代码中的Invoke和BeginInvoke之间有什么区别:
private void ProcessRoutine()
{
for (int nValue = StartFrom; nValue <= EndTo; nValue++)
{
this.Invoke(this.MyDelegate, nValue);
//this.BeginInvoke(this.MyDelegate, nValue);
}
MessageBox.Show("Counting complete!");
}
private void MessageHandler(int progress)
{
lblStatus.Text = lblStatus.Text = "Processing item: " + progress.ToString();
progressBar1.Value = progress;
}
Run Code Online (Sandbox Code Playgroud)
其中MyDelegate是对MessageHandler函数的引用.
我注意到使用BeginInvoke lblStatus.Text没有刷新,使用Invoke刷新标签.另外我知道Invoke等待它的执行完成.我感兴趣的最重要的案例是为什么在这种情况下刷新标签文本会有所不同.
如何使PowerShell等到Invoke-Item调用完成?我正在调用一个不可执行的项,所以我需要使用Invoke-Item来打开它.
我正在读取文件和从文件写入数据.文件中的数据可以是浮点数,双精度数,整数等.直到运行时才知道该类型.我将把存储在文件中的数据类型称为Tin.数据被读入或写入Tout类型的数组.直到运行时才知道这种类型.
代码序列是这样的.在已知的Open方法Tin和Tout中,我们可以为已知数据类型创建读写方法.
Open(...)
{
MethodInfo ReadMethod = typeof(...)GetMethod("ReadGeneric").MakeGenericMethod(new Type[] {typeof(Tin), typeof(Tout)}));
}
Run Code Online (Sandbox Code Playgroud)
读写循环重复数百万次,依赖于反射来调用适当的方法,如下所示.
Read loop
{
var values = (Tout[])ReadMethod.Invoke(this,new object[]{index});
process ...
}
Run Code Online (Sandbox Code Playgroud)
当使用性能分析器检查此代码时,如果只花时间调用运行时读写方法,我会发现c collosal amount.
我该如何加快速度呢?
有很多关于加速反射调用的帖子,例如:
https://codeblog.jonskeet.uk/2008/08/09/making-reflection-fly-and-exploring-delegates/
和这里:
示例:使用.NET/C#中的委托加速Reflection API
我的问题是关于加速泛型调用.这有可能吗?
我有一个抽象类和一个实现它的类......
public abstract class EncasulatedMessageHandler<T> where T : Message
{
public abstract void HandleMessage(T message);
}
public class Handler : EncasulatedMessageHandler<MyMessageType>
{
public int blat = 0;
public override void HandleMessage(MyMessageType message) { blat++; }
}
Run Code Online (Sandbox Code Playgroud)
我想要做的是建立这些消息处理程序类的列表并快速调用它们的HandleMessage()
目前,我正在做的事情大致如下:
object handler = Activator.CreateInstance(typeof(Handler)); // Ignore this, this is done up front.
MethodInfo method = type.GetMethod("HandleMessage", BindingFlags.Instance | BindingFlags.Public);
Action<object> hook = new Action<object>(delegate(object message)
{
method.Invoke(handler, new object[] { message });
});
// …Run Code Online (Sandbox Code Playgroud) 如何(int)从a 获得返回值methodInfo.invoke?
让我感到困难的是我使用字符串变量来调用方法.
检查以下示例:
if (Convert.ToBoolean(getParameterFromXML("issue", k, 1)) == true)
{
m = k + 1;
MethodInfo methodInfo = typeof(frmDetails).GetMethod("Issue" + m);
methodInfo.Invoke(this, Parameters);
}
Run Code Online (Sandbox Code Playgroud)
我能做什么?任何帮助,将不胜感激.
这是我的假设例子.我有一个非常简单的WPF窗口,带有一个Button.Button.Click事件有一个像这样的处理程序.
Action doit = () =>
{
Action error = () => { throw new InvalidOperationException("test"); };
try {
this.Dispatcher.Invoke(error, DispatcherPriority.Normal);
} catch (Exception ex) {
System.Diagnostics.Trace.WriteLine(ex);
throw;
}
};
doit.BeginInvoke(null, null);
Run Code Online (Sandbox Code Playgroud)
我希望通过Trace.WriteLine调用捕获并记下异常.相反,没有捕获异常并且应用程序中断.
有人知道可能的解释吗?为了捕获被调用的委托抛出的异常,您建议使用哪种解决方法Dispatcher.Invoke?
更新1:我throw在异常处理代码中添加了一个.我不想实际忽略该异常.我的问题的重点是正确处理它.问题是永远不会执行异常处理代码.
请记住,这是一个假设的例子.我的真实代码看起来不像那样.另外,假设我无法更改要调用的方法中的代码.
更新2:考虑这个类似的例子.我有一个Windows窗体窗口而不是WPF窗口.它有一个按钮,几乎完全相同的处理程序.唯一的区别在于调用代码.它是这样的.
this.Invoke(error);
Run Code Online (Sandbox Code Playgroud)
在Windows窗体中,执行异常处理代码.为什么不同?
下面的代码块导致错误:用户代码未处理TargetParameterCountException.参数计数不匹配.
public void AddListViewItem(string[] Data)
{
if (InvokeRequired)
{
Invoke(new Action<string[]>(AddListViewItem), Data);
}
else
{
ListViewData.Items.Add(Data[0]).SubItems.AddRange
(
new string[]
{
Data[1],
Data[2],
Data[3],
}
);
}
}
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
两者有什么区别?
Invoke((MethodInvoker) delegate {
checkedListBox1.Items.RemoveAt(i);
checkedListBox1.Items.Insert(i, temp + validity);
checkedListBox1.Update();
}
);
Run Code Online (Sandbox Code Playgroud)
VS
Invoke((MethodInvoker)
(
() =>
{
checkedListBox1.Items.RemoveAt(i);
checkedListBox1.Items.Insert(i, temp + validity);
checkedListBox1.Update();
}
)
);
Run Code Online (Sandbox Code Playgroud)
有没有理由使用lambda表达式?并将(MethodInvoker)委托和lambda转换为MethodInvoker类型?什么样的表达不需要(MethodInvoker)演员?
我需要知道Control.BeginInvoke和Control.Invoke调用是否会按照调用的顺序执行.
我有以下场景:
步骤1-4的执行顺序保证按所示顺序排列(从技术上讲,顺序不能保证是这样的,但我所拥有的问题仅在订单如图所示时才相关).
我的问题是,在步骤2中的BeginInvoke调用之前是否有可能执行步骤3中的Invoke/BeginInvoke调用?
另外,请不要评论阻止UI线程.
如何使用参数调用控件?我用Google搜索了这个,但无处可寻!
这是我得到的错误:
附加信息:参数计数不匹配.
当我简单地检查文本框控件的text属性是否为空时,会发生这种情况.这适用于WinForms:
if (this.textboxlink.Text == string.Empty)
SleepThreadThatIsntNavigating(5000);
Run Code Online (Sandbox Code Playgroud)
如果该行到catch块并且向我显示该消息,它会从此跳转.
这是我尝试调用控件的方式:
// the delegate:
private delegate void TBXTextChanger(string text);
private void WriteToTextBox(string text)
{
if (this.textboxlink.Dispatcher.CheckAccess())
{
this.textboxlink.Text = text;
}
else
{
this.textboxlink.Dispatcher.Invoke(
System.Windows.Threading.DispatcherPriority.Normal,
new TBXTextChanger(this.WriteToTextBox));
}
}
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?而且,当我只想阅读其内容时何时需要调用控件?
invoke ×10
c# ×7
.net ×4
begininvoke ×2
delegates ×2
wpf ×2
asynchronous ×1
exception ×1
lambda ×1
methodinfo ×1
parameters ×1
powershell ×1
reflection ×1
wait ×1
winforms ×1