Создание Com-Call AsyncC#

Место общения программистов C#
Ответить
Anonymous
 Создание Com-Call Async

Сообщение Anonymous »

Формы должны локализоваться, прежде чем появиться. К тому, чтобы форма получил фан-объект, который используется для получения желаемого текста.
Метод, вызванный Func-объектом, является композитным для нативного кода.
Так что мне нравится это: < /p>
namespace FormsDll{
public class FrmBaseTrackingForm : System.Windiows.Forms
{
//needs to set by the caller to give some Text-Provider-Method
public Func? TextFromIDFunc { get; set; }

//1st approach: just a call to te com-Method
protected string GetText(int iTextId)
{
if (TextFromIDFunc == null) return "";

return TextFromIDFunc(iTextId);
}

//2nd approach: try to do it asynchronous from the GUI-Threak
//intentionally not marked as async because using Task.FromResult
protected Task GetTextAsync(int iTextId)
{
//call the provided Func to receive our text
if (TextFromIDFunc == null) return Task.FromResult("");

return Task.FromResult(TextFromIDFunc(iTextId));
}

//next one async and Task.Run
protected async Task GetTextAsync2(int iTextId)
{
if (TextFromIDFunc == null) return "";
return await Task.Run(() => TextFromIDFunc(iTextId));
}

protected override void OnShown(EventArgs e)
{
//Localize Controls, try to get the TExt in different ways

/*1*/
string sLocalized = GetText(id);

/*2*/
string sLocalized = GetTextAsync(id).GetAwaiter().GetResult();

/*3 and marking OnShown as async */
//string sLocalized = await GetTextAsync(id);

string sLocalized = GetText(42).GetAwaiter().GetResult();
button1.Text = sLocalized;

base.OnShown(e);
}
}
}

namespace CallingDll{
internal class SomeWorker{

internal static string Text(int iTextId)
{
return ComObjects.objLanguageManager.LoadString(iTextId);
}

private void DoWork(){
//has to Show the WinForm
FormsDll.FrmBaseTrackingForm errForm = new()
{
//set the Func to use to get some Texts
TextFromIDFunc = Text
};
errForm.ShowDialog();
}
}
}
< /code>
wo, что происходит, так это следующее:
, когда в 1-й с использованием / 1 < /em> /, кажется, работает, но я получаю сообщение в отладке Visual Studios- Окно:
"Ein ausgehender aufruf kann nicht ausgeführt werden, da die anwendung einen eingabe-synchronisierten aufruf weiterleitet." что переводится на «исходящий звонок не может быть выполнен, потому что приложение пересылает входной синхронизированный вызов». -Thread и должен быть асинхронным. Поэтому я попробовал код в/ 2 /и/ 3 /, но они ничего не изменили.
Все варианты, кажется, работают, но они также делают сообщение в Вывод-окно, который меня немного пугает.
Так как это сделать правильно?

Подробнее здесь: https://stackoverflow.com/questions/794 ... call-async
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»