0

我想在 Opal 文件中使用此代码安装我的组件:

Element['#wizard_param_grid_editor'].render do
   ZGrid(rows: @work_spaces)
End

我得到了错误

Uncaught NoMethodError: undefined method render' for #]>


不,您使用并发对,它使用默认线程池的任务,并且您使用Run方法实例化任务,所以问题不在这里。但是您这里的代码有两个主要威胁:

var transBlock = new TransformBlock<string, T>
   (async fName =>
   {
       // process file here
   }, concurrentExecutionDataFlow);

你真的不应该transBlock每次都创建。的主要思想TPL Dataflow是您创建块一次并在之后使用它们。所以你应该重构你的应用程序以减少你正在实例化的块的数量,否则不TPL Dataflow应该使用这种情况。

您的代码中的另一个威胁是您明确阻止了线程!

// Right here
await Task.WhenAll(allTsk);
TstRst.Text = "Completed..";

从同步事件处理程序的方法调用awaitfor 任务会async void阻塞线程,因为默认情况下它会捕获同步上下文。首先,async void应该避免。其次,如果你是异步的,你应该一直是异步的,所以事件处理程序也应该是异步的。第三,您可以为您的任务使用延续来更新您的 UI 或使用当前同步上下文

所以,你的代码应该是这样的:

// store the sync context in the field of your form
SynchronizationContext syncContext = SynchronizationContext.Current;

// avoid the async void :)
public async Task AppIsolatedStore_TestInMultiThread_LstResultShouldBeEqual()

// make event handler async - this is the only exception for the async void use rule from above
private async void Button_Click(object sender, RoutedEventArgs e)

// asynchronically wait the result without capturing the context
await Task.WhenAll(allTsk).ContinueWith(
  t => {
    // you can move out this logic to main method
    syncContext.Post(new SendOrPostCallback(o =>
        {
            TstRst.Text = "Completed..";
        }));
  }
);
4

1 回答 1

1

在修复此问题 require 'opal-jquery' 之前 更改 require 'reactive-ruby'

于 2015-12-23T10:49:53.907 回答