将JS回调函数传递给C#RT组件错误:";无法强制转换类型为';mydb.SQLite3JSNoCallback';至';mydb.SQLite3JSNoCallback'&引用;
我有一个JavaScriptWindows8应用程序。我正在使用C#编写一个WinRT组件DLL,用于与数据库接口 对于所有函数,如OpenDB、ExecuteUpdate、ExecuteQuery(返回一行,返回一列值),我已经完成了IASyncOperation,并且非常成功 但是为了逐个处理大结果集中的每一行,我需要将一个回调函数从javascript传递到C#WinRT组件DLL。所以代码是这样的将JS回调函数传递给C#RT组件错误:";无法强制转换类型为';mydb.SQLite3JSNoCallback';至';mydb.SQLite3JSNoCallback'&引用;,c#,javascript,callback,windows-runtime,C#,Javascript,Callback,Windows Runtime,我有一个JavaScriptWindows8应用程序。我正在使用C#编写一个WinRT组件DLL,用于与数据库接口 对于所有函数,如OpenDB、ExecuteUpdate、ExecuteQuery(返回一行,返回一列值),我已经完成了IASyncOperation,并且非常成功 但是为了逐个处理大结果集中的每一行,我需要将一个回调函数从javascript传递到C#WinRT组件DLL。所以代码是这样的 My.WinRT.Component.Object.processEachRowASyc(
My.WinRT.Component.Object.processEachRowASyc(query, arguments, function(row) {
/* Row specific processing */
}).then(function(result) {
/* Process after Entire Row processing is Complete */
});
我已经编写了这样的RT组件
namespace mydb
{
public void delegate MyJSCallback(string msg);
public class Database {
public static IAsyncOperation<Database> OpenDB(string dbFile)
{
/* Open DB */
}
public IAsyncOperation<Database> ProcessEachRowASync(string sql,[ReadOnlyArray()] object[] arg, MyJSCallback myJSCallback)
{
return Task<Database>.Run(() =>
{
/* Query Processing */
IDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
string toRet = "{\"Name\":\"Raju\", \"Age\":\"21\"}";
//Javascript callback function called.
myJSCallback(toRet);
}
return this;
}).AsAsyncOperation();
}
}
}
名称空间mydb
{
公共void委托MyJSCallback(字符串msg);
公共类数据库{
公共静态IAsyncOperation OpenDB(字符串dbFile)
{
/*开放数据库*/
}
公共IAsyncOperation进程AchrowAsync(字符串sql,[ReadOnlyArray()]对象[]参数,MyJSCallback MyJSCallback)
{
返回任务。运行(()=>
{
/*查询处理*/
IDataReader reader=cmd.ExecuteReader();
while(reader.Read())
{
字符串toRet=“{\'Name\':\'Raju\',\'Age\':\'21\'”;
//调用Javascript回调函数。
myJSCallback(toRet);
}
归还这个;
}).AsAsAsyncOperation();
}
}
}
现在,当我从Visual Studio执行此操作时,我得到一个类型转换错误,我确信我在声明委托或其他地方出错
有人能告诉我我哪里做错了,以及如何纠正吗
下载此示例项目的URL为
为了进一步简化,我在RTComponent中编写了另一个函数,只显示回调错误,RT组件中的代码如下
public delegate void SQLite3JSNoCallback();
public IAsyncOperation<int> GetLastInsertRowId(SQLite3JSNoCallback someCallback)
{
return Task<int>.Run(() =>
{
someCallback();
return 0;
}).AsAsyncOperation();
}
public委托void SQLite3JSNoCallback();
公共IAsyncOperation GetLastInsertRowId(SQLite3JSNoCallback someCallback)
{
返回任务。运行(()=>
{
someCallback();
返回0;
}).AsAsAsyncOperation();
}
现在,在执行someCallback()时发生错误,该错误与上面的屏幕截图相同,只是更改了委托。“无法将类型为'mydb.SQLite3JSNoCallback'的对象强制转换为'mydb.SQLite3JSNoCallback'。”当我从函数中删除IASyncOperation时,js回调正常工作 这似乎是一个问题,因为我有一个阻塞回调函数作为参数发送,我相信。有人能澄清一下它如何与我的函数中的IASyncOperation一起工作吗 我是否应该向C#RT组件发送一个异步回调函数以获得回调 对于上述问题,如果您需要javascript回调才能成功工作,那么仍然需要将RT组件的函数设置为阻塞函数 问候,
Jay当我从函数中删除IASyncOperation时,js回调没有问题 这似乎是一个问题,因为我有一个阻塞回调函数作为参数发送,我相信。有人能澄清一下它如何与我的函数中的IASyncOperation一起工作吗 我是否应该向C#RT组件发送一个异步回调函数以获得回调 对于上述问题,如果您需要javascript回调才能成功工作,那么仍然需要将RT组件的函数设置为阻塞函数 问候,
Jay正如您所注意到的,这是由于异步性而发生的。我发现,通过调用UI线程上的回调,它现在将按预期工作 WinRT组件: Javascript通用应用程序 解决方案: 切换到
CoreApplication.MainView.CoreWindow.
Dispatcher.RunAsync(CoreDispatcherPriority.High, () =>
{
callback(15);
});
正如您所注意到的,这是因为异步性。我发现,通过调用UI线程上的回调,它现在将按预期工作 WinRT组件: Javascript通用应用程序 解决方案: 切换到
CoreApplication.MainView.CoreWindow.
Dispatcher.RunAsync(CoreDispatcherPriority.High, () =>
{
callback(15);
});
我很确定您希望使用而不是
Serialize(myMap)因为你不能很好地沟通,我不会再回答这个问题了。我已经厌倦了每两小时读一次新的代码块。很抱歉不清楚,请相信是GetLastInsertRowId(SQLite3JSNoCallback someCallback)函数也会失败,其他对象和函数调用与所面临的问题无关。请使用确切的错误更新问题,因为它不是由另一行代码引起的错误。现在删除了所有误导性的代码,只是硬编码了我对其他代码的期望。我很确定您希望使用而不是序列化(myMap);
由于您无法很好地沟通,我将不再回答这个问题。我厌倦了每两个小时阅读一段新代码。很抱歉不清楚,请相信是GetLastInsertRowId(SQLite3JSNoCallback someCallback)函数也会失败。其他对象和函数调用与所面临的问题无关。请使用确切的错误更新问题,因为它不是由另一行代码引起的错误。现在删除所有误导性代码,只需硬编码其他代码中我期望的代码。
CoreApplication.MainView.CoreWindow.
Dispatcher.RunAsync(CoreDispatcherPriority.High, () =>
{
callback(15);
});