我目前正在开发一个项目,其中一部分代码如下所示:
Select Case oReader.Name
Case "NameExample1"
Me.Elements.NameExample1.Value = oReader.ReadString
....
Case "NameExampleN"
Me.Elements.NameExampleN.Value = oReader.ReadString
....
End Select
Run Code Online (Sandbox Code Playgroud)
它会持续一段时间.代码显然很冗长,感觉可以改进.有没有办法动态调用VB.NET中的属性,这样就可以完成这样的事情:
Dim sReadString As String = oReader.ReadString
Me.Elements.InvokeProperty(sReadString).Value = sReadString
Run Code Online (Sandbox Code Playgroud) 更新:我已经在Microsoft Connect上提交了错误报告:https://connect.microsoft.com/VisualStudio/feedback/details/568271/debugger-halting-on-exception-thrown-inside-methodinfo-invoke#details
如果您可以在您的机器上重现此问题,请提供错误,以便修复它!
好的,我已经做了一些测试,我把问题简化为非常简单的事情:
一世.在抛出异常的新类中创建方法:
public class Class1 {
public void CallMe() {
string blah = null;
blah.ToLower();
}
}
Run Code Online (Sandbox Code Playgroud)
II.创建一个MethodInfo,在其他地方指向此方法:
Type class1 = typeof( Class1 );
Class1 obj = new Class1();
MethodInfo method = class1.GetMethod( "CallMe" );
Run Code Online (Sandbox Code Playgroud)
III.在try/catch块中包含对Invoke()的调用:
try {
method.Invoke( obj, null ); // exception is not being caught!
} catch {
}
Run Code Online (Sandbox Code Playgroud)
IV.没有调试器运行程序(工作正常).
v.现在使用调试器运行程序.发生异常时,调试器将暂停程序,即使它包含在试图忽略它的catch处理程序中.(即使你在catch块中放置了一个断点,它会在它到达之前停止!)
实际上,在没有调试器的情况下运行它时会发生异常.在一个简单的测试项目中,它在某个其他级别被忽略,但如果您的应用程序有任何类型的全局异常处理,它也会在那里被触发. [看评论]
这让我很头疼,因为它一直在触发我的应用程序的崩溃处理程序,更不用说尝试调试的痛苦了.
我正在建立一个聊天客户端,并不是100%肯定如何使用dispatcher.所以问题是我有一个方法:
public void LostConnection()
{
myGUI.chatBox.AppendText("Lost connection to room: "+ myGUI.UsernameText.ToString() + "\r\n");
}
Run Code Online (Sandbox Code Playgroud)
我是否需要(myGUI.chatBox... )用一个Dispatcher.Invoke?我感谢任何帮助.
我有一个有点复杂的WPF应用程序,当尝试使用调度程序在UI线程上调用调用时,似乎是"挂起"或卡在Wait调用中.
一般过程是:
if(this.Dispatcher.Thread != Thread.CurrentThread)
{
this.Dispatcher.Invoke(DispatcherPriority.Normal, (ThreadStart)delegate{
this.Name = value; // Call same setter, but on the UI thread
});
return;
}
SetValue(nameProperty, value); // I have also tried a member variable and setting the textbox.text property directly.
Run Code Online (Sandbox Code Playgroud)
我的问题是,当调用 dispatcher invoke方法时,它似乎每次都挂起,并且callstack指示它处于休眠状态,等待或加入Invoke实现.
那么,有什么我做错了,我错过了,显而易见或没有,或者有更好的方法调用UI线程来设置这个属性(和其他)?
编辑:解决方案是在线程委托的末尾调用System.Windows.Threading.Dispatcher.Run()(例如,正在执行工作的地方) - 感谢所有帮助过的人.
我是一名新手程序员,所以我可能在这里完全弄错了,但是这个问题让我更加困惑.
这实际上是这个问题的后续行动.
接受的答案是,你必须调用InvokeRequired以避免一些开销,因为你有可能已经在UI线程上运行了.
理论上,我同意它可以节省一些时间.经过一些测试后,我发现使用Invoke所需的时间比正常调用操作大两倍(测试如设置标签文本n次,或在RichTextBox中放置一个非常非常大的字符串).
但!然后有练习.
MSDN文档说:
此属性可用于确定是否必须调用invoke方法,如果您不知道哪个线程拥有控件,这可能很有用.
在大多数情况下,您确实知道何时尝试从另一个线程访问控件.实际上,我能想到的唯一情况是,从一个可以被线程X调用的方法以及所有者线程访问控件时.对我来说这是一个非常不可能的情况.
即使你真的不知道哪个线程试图操纵控件,也有一个事实是UI线程不必经常更新.对于您的GUI,25-30 fps之间的任何内容都应该没问题.并且在UI控件中进行的大多数更改所花费的时间远远少于毫秒.
因此,如果我理解正确,那么您必须检查是否需要调用的唯一情况是您何时不知道哪个线程正在访问控件以及何时GUI更新需要超过40毫秒才能完成.
然后我在http://programmers.stackexchange.com上询问了这个问题的答案.这表明,当您不需要它时,您不应该忙于过早优化.特别是如果它牺牲了代码的可读性.
所以这让我想到了一个问题:当你知道一个不同的线程访问一个控件时,你不应该只使用invoke,只有当你知道你的UI线程可以访问那段代码并且你发现它应该运行得更快时,你才应检查是否需要调用?
PS:在校对我的问题后,听起来真的像我在咆哮.但实际上我只是好奇为什么InvokeRequired似乎被许多比我更有经验的程序员所滥用.
我在PowerShell ISE中编写脚本,我正在使用Invoke-Sqlcmd.执行该命令后,Powershell会话切换到sqlps会话(PS SQLSERVER:>),我无法再次执行脚本.我必须退出PowerShell ISE并再次启动它.
所以我的问题是:如何从sqlps切换回常规ps或如何防止Invoke-Sqlcmd切换会话.
Invoke-Sqlcmd -ServerInstance $server -Database master -Username $user -Password $password -InputFile $file `
-ErrorAction Stop -OutputSqlErrors $true -Variable $variable
Run Code Online (Sandbox Code Playgroud)
这不起作用:
Push-Location
Invoke-Sqlcmd -ServerInstance $server -Database master -Username $user -Password $password -InputFile $file `
-ErrorAction Stop -OutputSqlErrors $true -Variable $variable
Pop-Location
Run Code Online (Sandbox Code Playgroud) 我的应用程序中有一个广播接收器,每次用户接到来电时都会被触发.现在,当它发生时,我需要广播接收器来调用特定活动中的特定方法.现在,我尝试将此方法设置为静态,因此可用,但有些东西告诉我这是一个非常糟糕的主意.
因此,我尝试在我的活动中实例化广播接收器而不在我的清单中声明它但问题是 - 当应用程序关闭时,活动不存在,因此我无法调用我的方法.
所以我的问题是 - 当广播接收器被激发时,如何在不使其成为"公共静态"的情况下调用此方法?
这是我的活动代码(我删除了不相关的部分)
package com.silverfix.ringo.activities;
import com.silverfix.ringo.R;
import com.silverfix.ringo.activities.fragments.DataManagerFragment;
import android.app.ActionBar;
import android.app.Activity;
import android.app.FragmentTransaction;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
public class RingtonesActivity extends Activity{
private DataManagerFragment dataManagerFragment;
private IntentFilter filter;
private BroadcastReceiver phoneCall;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_ringtones);
ActionBar ab = getActionBar();
ab.setDisplayShowTitleEnabled(false);
ab.setDisplayHomeAsUpEnabled(true);
dataManagerFragment = new DataManagerFragment();
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.add(dataManagerFragment, "DataManagerFragment");
ft.commit();
filter = new IntentFilter();
filter.addAction("android.intent.action.PHONE_STATE");
phoneCall = new BroadcastReceiver() {
@Override
public void …Run Code Online (Sandbox Code Playgroud) 我想知道是否有一种从字符串中调用函数的简单方法.我知道一种简单的方法,使用'if'和'else'.
int function_1(int i, int j) {
return i*j;
}
int function_2(int i, int j) {
return i/j;
}
...
...
...
int function_N(int i, int j) {
return i+j;
}
int main(int argc, char* argv[]) {
int i = 4, j = 2;
string function = "function_2";
cout << callFunction(i, j, function) << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是基本方法
int callFunction(int i, int j, string function) {
if(function == "function_1") {
return function_1(i, j);
} else if(function == "function_2") { …Run Code Online (Sandbox Code Playgroud) 问候,我正在用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来打开它.
invoke ×10
c# ×5
dispatcher ×2
powershell ×2
reflection ×2
wpf ×2
.net ×1
android ×1
asynchronous ×1
begininvoke ×1
c++ ×1
clr ×1
code-cleanup ×1
function ×1
methodinfo ×1
methods ×1
sql ×1
string ×1
vb.net ×1
wait ×1