[seasar-dotnet:2245] Re: S2Dxoのスレッドセーフについて

寺嶋 千晴 [E-MAIL ADDRESS DELETED]
2013年 2月 27日 (水) 09:36:06 JST


寺嶋です。
小谷さん、久保さんご回答いただきありがとうございます。

小谷さん
説明不足で申し訳ありません。
> 一ユーザーの場合は発生せず、複数ユーザーだと発生することがある、
> ということでしょうか?
はい、単一ユーザで動かしている場合は発生せず、複数ユーザになると発生します。

> できれば前後の状況も教えていただけたらと思います。
Dxoを利用している検索画面を同時に複数人が操作すると発生します。
# この検索画面は単一ユーザの場合は正常に動作します。

_TryExchangeSameNamePropertyメソッドの「_dxoMapping.ContainsKey(sourceInfo.Name)」で
Trueが返却されているにも関わらず、後続処理_ConvertPropertyメソッドの「_dxoMapping[sourceInfo.Name]」を
実行した時には既に情報が消えている状態が起きていました。
この僅かな間に_CollectConversionRuleAttributeメソッドが別スレッドで呼び出され_dxoMappingがクリアされて
しまったようです。

> また、参考までにお尋ねしたいのですが、
> .NET Framework4.0以上でしょうか?3.5以前でしょうか?
.NET Framework4.0を利用しております。

久保さん
>このままでQuillでDxoInterceptorは利用できないと思うので、
>DxoInterceptorを拡張しちゃうのがいいのかなぁと。
そうですね、拡張する方向で考えてみたいと思います。

>※今までQuill + Dxoって誰もやったことなかったのかな...!?
実績のある方がいらっしゃいましたらアドバイスをいただけると大変助かりますので
よろしくお願いいたします。

以上、よろしくお願いいたします。

-----Original Message-----
From: seasar-dotnet-bounces @ ml.seasar.org [mailto:seasar-dotnet-bounces @ ml.seasar.org] On Behalf Of kubo
Sent: Tuesday, February 26, 2013 10:59 PM
To: seasar-dotnet @ ml.seasar.org
Subject: [seasar-dotnet:2244] Re: S2Dxoのスレッドセーフについて

久保(jflute)です

DxoInterceptorの_CollectConversionRuleAttributeにて、
_dxoMappingを初期化していますね。
(なければ new して、既にあれば Clear())
Invokeのたびにここも実行されるので、
明らかにこのInterceptor自体が毎回newされることを
前提に作られているように見受けられます。
(が、その直後の lock がなぜだかちょとわからない...し、
それなら Clear() は必要ないかもだけど...)

ちょっと想像も入ってますが、
このままでQuillでDxoInterceptorは利用できないと思うので、
DxoInterceptorを拡張しちゃうのがいいのかなぁと。


※今までQuill + Dxoって誰もやったことなかったのかな...!?

2013/2/26 kotani.k <keikotani926 @ gmail.com>:
> 寺嶋さん
>
> 小谷です。
>
> 本当にマルチスレッドでの動作が原因なのかどうか、恥ずかしながら
> まだ理解できていないのですが、問題が発生したときと同じ操作を行うと、
> 一ユーザーの場合は発生せず、複数ユーザーだと発生することがある、
> ということでしょうか?
> できれば前後の状況も教えていただけたらと思います。
>
> また、参考までにお尋ねしたいのですが、
> .NET Framework4.0以上でしょうか?3.5以前でしょうか?
>
> 逆に質問ばかり返してしまってごめんなさい。
> よろしくお願いします。
>
>
> 2013年2月26日 16:38 寺嶋 千晴 <cterash @ jops.co.jp>:
>> お世話になっております。寺嶋です。
>>
>> 全開、S2Dxo.netについてご教授いただきありがとうございました。
>> 今回もS2Dxo.netについて教えていただきたいことがあり投稿させて頂きました。
>>
>> データが格納されているオブジェクトをS2Dxoにて相互変換を行なっていますが
>> DxoInterceptor内でKeyNotFoundExceptionが発生してしまいました。
>> 調査をしてみたところDxoInterceptor.csのDxoMappingから情報を取得する際
>> 例外が発生したようです。
>>
>> 今回ASP.NETで開発しており、DxoをQuill管理にすることでsingletonになり
>> DxoMappingが複数のスレッドから操作され例外が発生したものと思われます。
>> DxoInterceptorをスレッドセーフに使用する方法がありますでしょうか?
>>
>> 以上、よろしくお願いいたします。
>>
>> ---- エラー内容 ----
>> System.Collections.Generic.KeyNotFoundException: 指定されたキーはディレクトリ内に存在しませんでした。
>>    場所 System.Collections.Generic.Dictionary`2.get_Item(TKey key)
>>    場所 Seasar.Dxo.Interceptor.DxoInterceptor._ConvertProperty(PropertyInfo sourceInfo, Object source, Object dest, PropertyInfo destInfo, Boolean existProperty)
>>    場所 Seasar.Dxo.Interceptor.DxoInterceptor._TryExchangeSameNameProperty(PropertyInfo sourceInfo, Object source, Object dest, Type destType, Int32 cnt)
>>    --- 内部例外スタック トレースの終わり ---
>>    場所 Seasar.Dxo.Interceptor.DxoInterceptor._TryExchangeSameNameProperty(PropertyInfo sourceInfo, Object source, Object dest, Type destType, Int32 cnt)
>>    --- 内部例外スタック トレースの終わり ---
>>    場所 System.RuntimeMethodHandle._InvokeMethodFast(IRuntimeMethodInfo method, Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeType typeOwner)
>>    場所 System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)
>>    場所 System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
>>
>>
>> _______________________________________________
>> seasar-dotnet mailing list
>> seasar-dotnet @ ml.seasar.org
>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
> _______________________________________________
> seasar-dotnet mailing list
> seasar-dotnet @ ml.seasar.org
> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
_______________________________________________
seasar-dotnet mailing list
seasar-dotnet @ ml.seasar.org
https://ml.seasar.org/mailman/listinfo/seasar-dotnet


seasar-dotnet メーリングリストの案内