У меня есть, что, вероятно, простая проблема. Я использую interop для вызова асинхронной функции в CompactFramework. После того, как я получу результат выполнения, я хотел бы поднять событие, которое будет улавливаться формой, и, основываясь на результатах, я бы отобразил некоторые данные на экране. Проблема, однако, в том, что, когда функция interop возвращает результат, она возвращает ее в рабочий поток, и если я подниму событие, оно останется на рабочем потоке, и я не могу отобразить какие-либо данные в форме, если только я не используйте Invoke.Throw event в основной теме из рабочей нити C# CF
Может ли кто-нибудь предложить способ объединить рабочий поток на основной поток? И поднять событие из основного потока? Я нашел несколько примеров, которые проходят через делегатов, подписавшихся на это событие, и используют BeginInvoke для создания события в основном потоке, однако все они используют ISynchronizeInvoke, который недоступен в Compact Framework.
Мой код ниже:
public delegate void CellTowerFoundEventHandler(CellTower towerInfo);
public class CellTowerProvider
{
public delegate void RILRESULTCALLBACK(uint dwCode, IntPtr hrCmdID, IntPtr lpData, uint cbData, uint dwParam);
public delegate void RILNOTIFYCALLBACK(uint dwCode, IntPtr lpData, uint cbData, uint dwParam);
private RILCELLTOWERINFO towerDetails;
private CellTower cellTowerInfo;
private IntPtr radioInterfaceLayerHandle;
public CellTowerProvider()
{
radioInterfaceLayerHandle = IntPtr.Zero;
IntPtr radioResponseHandle = IntPtr.Zero;
// Initialize the radio layer with a result callback parameter.
radioResponseHandle = RIL_Initialize(1, new RILRESULTCALLBACK(CellDataCallback), null, 0, 0, out radioInterfaceLayerHandle);
// The initialize API call will always return 0 if initialization is successful.
if (radioResponseHandle != IntPtr.Zero)
{
return;
}
// Query for the current tower data.
radioResponseHandle = RIL_GetCellTowerInfo(radioInterfaceLayerHandle);
}
public void CellDataCallback(uint dwCode, IntPtr hrCmdID, IntPtr lpData, uint cbData, uint dwParam)
{
// Refresh the current tower details
towerDetails = new RILCELLTOWERINFO();
// Copy result returned from RIL into structure
Marshal.PtrToStructure(lpData, towerDetails);
cellTowerInfo = new CellTower()
{
TowerId = Convert.ToInt32(towerDetails.dwCellID),
LocationAreaCode = Convert.ToInt32(towerDetails.dwLocationAreaCode),
MobileCountryCode = Convert.ToInt32(towerDetails.dwMobileCountryCode),
MobileNetworkCode = Convert.ToInt32(towerDetails.dwMobileNetworkCode),
};
if (CellTowerFound != null)
CellTowerFound(cellTowerInfo);
// Release the RIL handle
RIL_Deinitialize(radioInterfaceLayerHandle);
}
}
CF - обертка вокруг System.NotImplementedException. Это было бы проблемой без проблем в настольной версии, возможно, вам нужно снизить свои ожидания от того, что практично в приложении на основе CF. –
Ahh! Хороший старый «CF - обертка вокруг System.NotImplementedException». - придумал Рори Блайт на сессии DotNetRocks, правильно? Я мог бы согласиться на v1.0, но не сегодня на v3.5! –