将JS回调函数传递给C#RT组件错误:";无法强制转换类型为';mydb.SQLite3JSNoCallback';至';mydb.SQLite3JSNoCallback'&引用;

将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(

我有一个JavaScriptWindows8应用程序。我正在使用C#编写一个WinRT组件DLL,用于与数据库接口

对于所有函数,如OpenDB、ExecuteUpdate、ExecuteQuery(返回一行,返回一列值),我已经完成了IASyncOperation,并且非常成功

但是为了逐个处理大结果集中的每一行,我需要将一个回调函数从javascript传递到C#WinRT组件DLL。所以代码是这样的

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)序列化(myMap);
由于您无法很好地沟通,我将不再回答这个问题。我厌倦了每两个小时阅读一段新代码。很抱歉不清楚,请相信是GetLastInsertRowId(SQLite3JSNoCallback someCallback)函数也会失败。其他对象和函数调用与所面临的问题无关。请使用确切的错误更新问题,因为它不是由另一行代码引起的错误。现在删除所有误导性代码,只需硬编码其他代码中我期望的代码。
CoreApplication.MainView.CoreWindow.
 Dispatcher.RunAsync(CoreDispatcherPriority.High, () =>
{
    callback(15);
});