尝试更新图像时出现此错误.这是一个跨线程更新,但我使用.Invoke(),所以这不应该是问题,如果它.
我正在使用以下方法来调用jar文件中的类:
invokeClass("path.to.classfile", new String[] {});
public static void invokeClass(String name, String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, MalformedURLException {
File f = new File(System.getProperty("user.home") + File.separator + ".myapplication"+File.separator+"myjar.jar");
URLClassLoader u = new URLClassLoader(new URL[]{f.toURI().toURL()});
Class c = u.loadClass(name);
Method m = c.getMethod("main", new Class[] { args.getClass() });
m.setAccessible(true);
int mods = m.getModifiers();
if (m.getReturnType() != void.class || !Modifier.isStatic(mods) || !Modifier.isPublic(mods)) {
throw new NoSuchMethodException("main");
}
try {
m.invoke(null, new Object[] { args });
} catch (IllegalAccessException e) {
}
}
Run Code Online (Sandbox Code Playgroud)
是否可以在单独的进程上调用它?那么正在运行的应用程序和新调用的应用程序没有任何共同之处? …
我不确定这个问题是否相关,但我看到"方法被调用"这个表达很多,那么在调用方法或调用方法之间是否有技术差异,或者它只是同一个动作的其他单词?
PS:很明显,我不是英语母语人士,在网上寻找调用定义没有帮助.
我在基类中有以下代码:
public static void InvokeExternal(Delegate d, object param, object sender)
{
if (d != null)
{
//Check each invocation target
foreach (Delegate dDelgate in d.GetInvocationList())
{
if (dDelgate.Target != null && dDelgate.Target is System.ComponentModel.ISynchronizeInvoke
&& ((System.ComponentModel.ISynchronizeInvoke)(dDelgate.Target)).InvokeRequired)
{
//If target is ISynchronizeInvoke and Invoke is required, invoke via ISynchronizeInvoke
((System.ComponentModel.ISynchronizeInvoke)(dDelgate.Target)).Invoke(dDelgate, new object[] { sender, param });
}
else
{
//Else invoke dynamically
dDelgate.DynamicInvoke(sender, param);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
此代码示例负责调用一个事件,表示为多播委托,其中调用目标包括不关心跨线程的小类,以及实现ISynchronizeInvoke和关注跨线程的类,如Windows窗体控件.
理论上,这个片段工作得很好,没有错误发生.但是DynamicInvoke速度非常慢,并不是说它是应用程序的当前瓶颈.
所以,我的问题是:有没有办法加快这个小功能而不破坏功能直接订阅事件?
所有活动/代表的签名是 (object sender, EventArgs param)
我必须从线程关闭Form,并且正在使用Form的Invoke方法调用Close()方法。
问题是,关闭时将处理该窗体,并且我收到一条InvalidOperationExecption消息:“在创建窗口句柄之前,无法在控件上调用Invoke或BeginInvoke”。
仅当在Close方法中使用“ Step Into”进行调试时,我才遇到此异常,但是我不想冒险在正常运行时可能出现错误。
这是重现它的示例代码:
private void Form1_Load(object sender, EventArgs e)
{
Thread thread = new Thread(CloseForm);
thread.Start();
}
private void CloseForm()
{
this.Invoke(new EventHandler(
delegate
{
Close(); // Entering with a "Step Into" here it crashes.
}
));
}
Run Code Online (Sandbox Code Playgroud)
表单以自动生成的表单代码(我不希望对其进行修改)处理:
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
Run Code Online (Sandbox Code Playgroud)
如果有人可以为我提供这种方法或其他方法来关闭另一个线程中的表单,我将不胜感激。
我正在开发一个UI应用程序,在此过程中创建一个COM对象.问题是,我想完全在另一个线程上"移动"这个COM对象.
我这样做是:
问题是,正如此消息框所示,对象方法仍然在原始UI线程上执行,而不是在我创建的线程上执行并完成所有这些步骤.还有一点需要注意,在调用接口方法之后,我还在其中设置了一个经典的消息循环.
我怎样才能改变这种行为并实现我想要的目标?(也就是说,我希望源自我新创建的线程的COM对象调用在IT上执行,而不是在原始应用程序线程上执行)
这里有一些伪代码使它更清晰:
void myMainUIMethod(){
MessageBox(GetCurrentThreadId()); // displays 1
CreateThread(&myCOMObjectThreadProc);
}
void myCOMObjectThreadProc(){
MessageBox(GetCurrentThreadId()); // displays 2
CoInitialize(NULL);
myObject = CoCreateInstance(myObjectsCLSID);
myObjectInterface = myObject->QueryInterface(myObjectInterfaceCLSID);
myObjectInterface->showThreadIDMessageBox(); // this would be the COM object method call
}
And, in the VB6 code of the object, here's the pseudo-definition of showThreadIDMessageBox.
Public Sub showThreadIDMessageBox()
Call MessageBox(GetCurrentThreadId()) //displays 1, I want it to display 2
End Sub
Run Code Online (Sandbox Code Playgroud)
在创建新线程之前,我已经通过CoUninitalizing在主线程上实现了我想要的.但为什么会这样呢?如果COM在我创建新线程之前在主线上初始化,可能由于某种原因它必须是..我不希望应用程序稍后崩溃,因为我必须在创建新线程之前调用CoUninitialize.这里有一些伪代码,它说明了首先调用CoInitialize的线程将是STA对象选择的线程.
void myMainUIMethod(){
MessageBox(GetCurrentThreadId()); // displays 1
CoUninitialize(); // uninitialize …Run Code Online (Sandbox Code Playgroud) 我试图在WinForms C#应用程序中创建一个单独的线程,启动一个控制ProgressBar(marquee)的后台工作程序.问题在于,当我尝试将条形图设置为可见时,它什么都不做,我尝试过多种形式的Invoke,但它们似乎没有帮助.
progressBarCycle从单独的线程调用以下方法.
BackgroundWorker backgroundWorker = new BackgroundWorker();
public void progressBarCycle(int duration)
{
backgroundWorker.DoWork += new DoWorkEventHandler(backgroundWorker_DoWork);
backgroundWorker.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker_ProgressChanged);
backgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker_RunWorkerCompleted);
backgroundWorker.WorkerReportsProgress = true;
backgroundWorker.WorkerSupportsCancellation = true;
backgroundWorker.RunWorkerAsync(duration);
}
private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
worker.ReportProgress(0);
DateTime end = DateTime.Now.AddMilliseconds((int)e.Argument);
while (DateTime.Now <= end)
{
System.Threading.Thread.Sleep(1000);
}
}
private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (!this.IsHandleCreated)
this.CreateHandle();
statusStrip1.Invoke((MethodInvoker)delegate
{
progressBar1.Visible = false;
});
// if (!this.IsHandleCreated)
// …Run Code Online (Sandbox Code Playgroud) 我有两种方法,MethodA&MethodB.MethodB必须在UI线程上运行.我需要它们一个接一个地运行而不允许MethodC它们运行.
MethodC 当用户点击一个可爱的小按钮时调用.
我做了什么来确保这是Lock围绕代码:
lock (MyLock)
{
MethodA(param1, param2);
MyDelegate del = new MyDelegate(MethodB);
if (this.IsHandleCreated) this.Invoke(del);
}
Run Code Online (Sandbox Code Playgroud)
并为MethodC:
public void MethodC()
lock (MyLock)
{
Do bewildering stuff.....
}
Run Code Online (Sandbox Code Playgroud)
问题是我卡住了.看起来我的代码陷入了僵局.
当我看到线程时,我看到按钮点击调用的代码被卡住lock (MyLock)了MethodC,我的另一个线程似乎陷入了困境this.Invoke(del).
我已经读过从内部调用一个方法是危险的,Lock但是因为我是那个在那里编写代码的人,这似乎发生了,即使只是Thread.Sleep我认为这不是代码让我陷入困境.
为什么Invoked方法会停止工作?它是否可能等待锁定methodC被释放后再返回到它所调用的原始锁定?
我想捕获在使用invoke方法调用的方法中抛出的异常.
public void TestMethod()
{
try
{
method.Invoke(commandHandler, new[] { newCommand });
}
catch(Exception e)
{
ExceptionService.SendException(e);
}
}
Run Code Online (Sandbox Code Playgroud)
method.Invoke调用以下方法:
public void Register(/*parameters*/)
{
if(test_condition())
throw new CustomException("Exception Message");
}
Run Code Online (Sandbox Code Playgroud)
问题是当我捕获CustomException时,在TestMethod中,catch语句中的e变量没有类型CustomException.它有以下消息:"调用目标已抛出异常".
我想捕获已引发的异常(这是CustomException),并将其传递给ExceptionService机制.
我究竟做错了什么?
我有一个简单的问题,可能很容易回答,但谷歌的强烈使用没有提出我的问题的答案.所以我道歉,如果有正确的解决方案,我没有看到它.
如果我有一个类似的方法调用
Object.Add(string text, System.Drawing.Color color);
Run Code Online (Sandbox Code Playgroud)
这是一些文本添加到具有指定颜色的某个对象,我想动态地改变颜色,然后我可以输入某个.喜欢
Object.Add("I'm a string", SomeBool ? Color.Red : Color.Green);
Run Code Online (Sandbox Code Playgroud)
这非常有用,但只要我想比较两个案例就会失败.
我正在寻找的东西是(伪代码)
Object.Add("I'm another string", new delegate (Sytem.Drawing.Color)
{
if (tristate == state.state1)
{
return Color.Blue;
}
else if (tristate == state2)
{
return Color.Green;
}
// ...
});
Run Code Online (Sandbox Code Playgroud)
但无论我在尝试什么,它都会引发编译错误.
我尝试了很多关于如何将函数作为方法参数传递的谷歌,但我会发现很多
public void SomeFunction(Func<string, int> somefunction)
{
//...
}
Run Code Online (Sandbox Code Playgroud)
这不是我的问题.
谢谢 :)