我最近有一次非常糟糕的采访,他们会和你一起打好警察/坏警察.无论我回答什么,对他们中的一个人来说都不够好,我的信心也在逐渐缩小.他真正困惑我的最后一个问题如下:
如果控件需要InvokeRequired,那么.Invoke或.BeginInvoke会有区别吗?
让我举个例子,我是如何理解的:
public delegate string WorkLongDelegate(int i);
var del = new WorkLongDelegate(WorkLong);
var callback = new AsyncCallback(CallBack);
del.BeginInvoke(3000, callback, del);
public string WorkLong(int i)
{
Thread.Sleep(i);
return (string.Format("Work was done within {0} seconds.", i));
}
private void CallBack(IAsyncResult ar)
{
var del = (WorkLongDelegate) ar.AsyncState;
SetText2(del.EndInvoke(ar));
}
private void SetText2(string s)
{
if(InvokeRequired)
{
// What is the difference between BeginInvoke and Invoke in below?
BeginInvoke(new MethodInvoker(() => textBox1.Text = s));
}
else
{
textBox1.Text = s;
}
} …Run Code Online (Sandbox Code Playgroud) 我有一点问题.我正在开发一个Android applikation.在那里,您可以动态地从其他应用程序(包)加载类.首先,我不想"破解"第三方应用程序,我想尝试为自己的应用程序构建插件.那我有什么?
2测试应用程序和包含两个应用程序的1个库.
所以app1的代码:
package com.ftpsynctest.app1;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import android.app.Activity;
import android.content.pm.PackageManager.NameNotFoundException;
import android.os.Bundle;
import com.syncoorp.ftpsyncx.commons.SyncFile;
import dalvik.system.PathClassLoader;
public class App1Activity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
SyncFile f = new SyncFile("bla");
String classname = "com.ftpsynctest.app2.classcall";
String classpath = getApk("com.ftpsynctest.app1") + ":" + getApk("com.ftpsynctest.app2");
PathClassLoader myClassLoader = new dalvik.system.PathClassLoader(classpath, ClassLoader.getSystemClassLoader());
try {
Class c = Class.forName(classname, true, myClassLoader);
for (Method m : c.getDeclaredMethods()) {
System.out.println("Method: " + m.getName());
for (Type t …Run Code Online (Sandbox Code Playgroud) 我确信这个问题已在某个地方得到解答,但我遇到了一些重大问题,找到了正确的关键字组合来找到它.
我很想知道它是否有可能做到这样的事情:
dynamic someObj = new SomeObject();
var methodName = "someMethodName";
// execute methodName on someObj
Run Code Online (Sandbox Code Playgroud)
我基本上想知道是否可以使用存储方法名称的变量在动态对象上执行方法.
基本上我试图通过名称调用dll,实例化一个对象,然后在该dll中按名称调用方法.我得到了一个"调用目标引发了异常." 在Method.Invoke期间.我很确定我的问题是对方法的参数进行类型转换.我想知道是否有人对此异常有任何意见.此外,欢迎任何有关如何修改我的方法的建议.
public void calldll(string dllName, string typeName, string methodName, string arguments) {
string[] argumentArray = arguments.Split(new char[] { '|' }, StringSplitOptions.None);
Assembly assembly = Assembly.LoadFrom(dllName);
System.Type type = assembly.GetType(typeName);
Object o = Activator.CreateInstance(type);
MethodInfo method = type.GetMethod(methodName);
ParameterInfo[] parameters = method.GetParameters();
object[] methodParameters = new object[parameters.GetLength(0)];
for (int i = 0; i < parameters.Length - 1; i++)
{
var converter = TypeDescriptor.GetConverter(parameters[i].GetType());
methodParameters[i] = converter.ConvertFrom(argumentArray[i]);
}
method.Invoke(o, methodParameters); }
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用线程并防止程序在线程繁忙时冻结.它应该显示进度(写入0/1)并且不仅仅是在完成后显示结果,同时冻结表格.
在当前程序中,我正在尝试写入文本框,实际上看到不断进展,并且表单不会受到其他线程任务的影响.
我现在拥有的是我可以使用调用写入带有线程的文本框,但它只显示结果(表单在线程繁忙时冻结),并且表单冻结.
表格图片:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
namespace MultiThreading
{
public partial class MultiThreading : Form
{
public MultiThreading()
{
InitializeComponent();
}
Thread writeOne, writeTwo;
private void writeText(TextBox textBox, string text)
{
if (textBox.InvokeRequired)
{
textBox.BeginInvoke((MethodInvoker)delegate()
{
for (int i = 0; i < 500; i++)
{
textBox.Text += text;
}
});
}
else
{
for (int i = 0; i < 500; i++)
{ …Run Code Online (Sandbox Code Playgroud) 以下MessageBox.Show调用显示"内部".这是一个错误吗?
private void Throw()
{
Invoke(new Action(() =>
{
throw new Exception("Outer", new Exception("Inner"));
}));
}
private void button1_Click(object sender, EventArgs e)
{
try
{
Throw();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message); // Shows "Inner"
}
}
Run Code Online (Sandbox Code Playgroud) 我正在攻读考试,我需要一些帮助才能理解以下剪辑代码中发生了什么.
class A {
public void method1(A X) {
System.out.println("A");
}
}
class B extends A {
public void method2() {
System.out.println("B");
}
}
class C extends B {
public void method1(A x) {
System.out.println("C");
}
}
class D extends C {
public void method1(D x) {
System.out.println("D");
}
}
public class test {
public static void main(String[] args) {
C c = new D();
B b = c;
c.method1(c); // prints C
b.method1(b); // prints C
}
}
Run Code Online (Sandbox Code Playgroud)
好吧,这就是我的想法:c.method1(c)在C中调用method1而在D中调用method1,因为c作为C是decleard,因此D中的method1不可见.但是b.method1(b)更难.B没有method1,我假设将使用超类中的method1,但事实并非如此.为什么在C中使用该方法?我在B中添加了一个新的D但是D的特化没有任何可见,因为b来自B型.
在Java中,我可以通过引用其完全限定名称来调用类或方法而无需导入它:
public class Example {
void example() {
//Use BigDecimal without importing it
new java.math.BigDecimal(1);
}
}
Run Code Online (Sandbox Code Playgroud)
类似的语法显然不能使用Python:
class Example:
def example(self):
# Fails
print(os.getcwd())
Run Code Online (Sandbox Code Playgroud)
抛开良好做法和PEP建议,我可以在Python中做同样的事情吗?
我对 Java (6/7/8) 语法有一个愚蠢的问题 - 这两个方法调用片段总是等效的吗?
和this
this.myMethod(4);
Run Code Online (Sandbox Code Playgroud)没有this
myMethod(4);
Run Code Online (Sandbox Code Playgroud)注意:当然,问题是关于参数的每个数字、类型和组合
较弱的语句:给定程序P,我可以仅通过在每个方法调用前面P'删除来创建程序吗?this.
我考虑了本地类、匿名类、内部类和各种继承,但没有发现任何矛盾。所以我相信这两个片段实际上是相同的。不幸的是我无法找到任何合适的证明(例如来自官方语法)。
你能通过反证证明我错了,或者给我一些构建等价证明的线索吗?多谢。
编辑:等价被证明是错误的(见下面的评论)那较弱的陈述呢?
我有两个WinForms(Setting和frmMain).我在Setting的表单中有一个TreeView,我想以FillTree第二种形式调用它的方法frmMain.
我正在使用它TreeView.Invoke来进行线程化.
这是我在Setting的表单中填充TreeView的代码:
TreeNode parentNode;
public void FillTree(DataTable dtGroups, DataTable dtGroupsChilds)
{
treeViewGroups.Nodes.Clear();
if (dtGroups == null) return;
foreach (DataRow rowGroup in dtGroups.Rows)
{
parentNode = new TreeNode
{
Text = rowGroup["Groupname"].ToString(),
Tag = rowGroup["Groupid"]
};
treeViewGroups.Invoke(new Add(AddParent), new object[] { parentNode });
if (dtGroupsChilds == null) continue;
foreach (DataRow rowUser in dtGroupsChilds.Rows)
{
if (rowGroup["Groupid"] == rowUser["Groupid"])
{
TreeNode childNode = new TreeNode
{
Text = rowUser["Username"].ToString(),
Tag = …Run Code Online (Sandbox Code Playgroud)